From 7f2111c25184bcc3ced97cea322e55b3a105dfc5 Mon Sep 17 00:00:00 2001 From: liushijie <lslola@126.com> Date: 星期五, 14 三月 2025 09:22:26 +0800 Subject: [PATCH] 项目搭建 --- LifePayment/LifePayment.Application.Contracts/RecordOperateHistoryEto.cs | 47 LifePayment/LifePayment.Domain.Shared/AlipayModel/UserAgreementUnsignInput.cs | 110 LifePayment/LifePayment.Domain.Shared/AlipayModel/UserAgreementPageSignResponse.cs | 21 LifePayment/LifePayment.Domain.Shared/AlipayModel/DataDataserviceBillDownloadUrlQueryInput.cs | 63 LifePayment/LifePayment.Domain/ACOOLY/IACOOLYManager.cs | 75 LifePayment/LifePayment.Domain.Shared/AlipayModel/FundBatchOrderChangedContent.cs | 177 LifePayment/LifePayment.Domain/LifePay/LifePayUser.cs | 27 LifePayment/LifePayment.Domain.Shared/Enum/Wallet/WalletAccountOpenBankBindStatusEnum.cs | 23 LifePayment/LifePayment.EntityFrameworkCore/LifePaymentServicesDbContext.cs | 7 LifePayment/LifePayment.Domain.Shared/Common/GlobalRandom.cs | 119 LifePayment/LifePayment.Domain.Shared/Ali/AliPaySignAuthenticationDefaults.cs | 13 LifePayment/LifePayment.Domain.Shared/Enum/Wallet/WalletPayChannelFeeTypeEnum.cs | 23 LifePayment/LifePayment.Domain.Shared/AlipayModel/UserAgreementQueryInput.cs | 96 LifePayment/LifePayment.Domain.Shared/Enum/Wallet/WalletRechargeStatusEnum.cs | 36 LifePayment/LifePayment.Domain.Shared/Enum/Wallet/WalletPayChannelEnum.cs | 35 LifePayment/LifePayment.Domain.Shared/AlipayModel/FundBatchUniTransferInput.cs | 186 LifePayment/LifePayment.Domain.Shared/AlipayModel/UserAgreementPageSignInput.cs | 327 + LifePayment/LifePayment.Domain.Shared/AlipayModel/FundBatchUniTransferResponse.cs | 48 LifePayment/LifePayment.Domain.Shared/Enum/Wallet/WalletOperateAmountTypeEnum.cs | 44 LifePayment/LifePayment.Domain.Shared/AlipayModel/AliPayEcsignConstant.cs | 42 LifePayment/LifePayment.Domain.Shared/LifePaymentConstant.cs | 707 ++ LifePayment/LifePayment.Domain.Shared/Enum/Wallet/WalletPayTypeEnum.cs | 32 LifePayment/LifePayment.Domain.Shared/WeChat/WxPaySignAuthenticationDefaults.cs | 7 LifePayment/LifePayment.Domain/Ali/AliPayExtensions.cs | 23 LifePayment/LifePayment.Domain.Shared/Common/TimeUtility.cs | 65 LifePayment/LifePayment.Domain.Shared/Enum/Wallet/WalletTransferStatusEnum.cs | 48 LifePayment/LifePayment.Domain.Shared/AlipayModel/FundTransOrderChangedInput.cs | 269 + LifePayment/LifePayment.Domain/WeChat/WxPayExtensions.cs | 13 LifePayment/LifePayment.Domain.Shared/Enum/Wallet/WalletAccountTypeEnum.cs | 51 LifePayment/LifePayment.Domain.Shared/Enum/Wallet/WalletAccountOpenStatusEnum.cs | 39 LifePayment/LifePayment.Application.Contracts/LifePay/LifePayOutput.cs | 182 LifePayment/LifePayment.Domain.Shared/Extension/CheckExtensions.cs | 83 LifePayment/LifePayment.Domain.Shared/WeChat/WxMiniAppOption.cs | 36 LifePayment/LifePayment.Domain/Ali/AliPayApi.cs | 37 LifePayment/LifePayment.Domain.Shared/Extension/EnumExtension.cs | 295 + LifePayment/LifePayment.Host/LifePaymentService.HttpApi.xml | 88 LifePayment/LifePayment.Domain.Shared/AlipayModel/FundAccountQueryInput.cs | 29 .vs/LiftPay/v17/.wsuo | 0 LifePayment/LifePayment.Domain.Shared/Wallet/WalletManagerOutput.cs | 300 + LifePayment/LifePayment.Domain.Shared/AlipayModel/FundBatchDetailQueryResponse.cs | 539 ++ LifePayment/LifePayment.Domain.Shared/AlipayModel/UserAgreementQueryResponse.cs | 148 LifePayment/LifePayment.Domain.Shared/AlipayModel/FundTransUniTransferResponse.cs | 76 LifePayment/LifePayment.Domain.Shared/Enum/Wallet/IncomeExpenseTypeEnum.cs | 24 LifePayment/LifePayment.Application.Contracts/LifePay/LifePayInput.cs | 227 LifePayment/LifePayment.Domain.Shared/AlipayModel/FundTransCommonQueryResponse.cs | 179 LifePayment/LifePayment.Domain.Shared/Enum/Wallet/WalletAccountOpenAlipaySignStatusEnum.cs | 23 LifePayment/LifePayment.Domain/Ali/AliPayAuthenticationHandler.cs | 108 LifePayment/LifePayment.Domain.Shared/Ali/AliRechargeNotifyInput.cs | 210 LifePayment/LifePayment.Domain.Shared/ACOOLY/ACOOLYConstant.cs | 69 LifePayment/LifePayment.Domain.Shared/AlipayModel/FundBatchDetailQueryInput.cs | 157 LifePayment/LifePayment.Domain.Shared/AlipayModel/FundTransPagePayInput.cs | 291 + LifePayment/LifePayment.Domain.Shared/Enum/Wallet/WalletDetailBusinessTypeEnum.cs | 35 LifePayment/LifePayment.Domain.Shared/Enum/Wallet/WalletMainStatusEnum.cs | 27 LifePayment/LifePayment.Domain.Shared/WeChat/WxMiniTokenInfo.cs | 19 LifePayment/LifePayment.Application/LifePay/LifePayService.cs | 838 +++ LifePayment/LifePayment.Domain.Shared/AlipayModel/FundAccountbookCreateInput.cs | 57 LifePayment/LifePayment.Domain/WeChat/WxPayRsaHelper.cs | 16 .vs/VSWorkspaceState.json | 6 LifePayment/LifePayment.Domain.Shared/ACOOLY/ACOOLYOutput.cs | 524 ++ LifePayment/LifePayment.Domain/Ali/AlipayApiClient.cs | 418 + LifePayment/LifePayment.Domain.Shared/Extension/ListExtensions.cs | 141 LifePayment/LifePayment.Domain/Ali/AlipayManager.cs | 138 LifePayment/LifePayment.Domain.Shared/Wallet/WalletSingleTransactionInput.cs | 413 + LifePayment/LifePayment.Domain.Shared/Ali/GetPayQrCodeInput.cs | 28 LifePayment/LifePayment.Domain.Shared/AlipayModel/AliPayEcsignInterfaceOutput.cs | 528 ++ LifePayment/LifePayment.Domain.Shared/AlipayModel/AlipayConstant.cs | 37 LifePayment/LifePayment.Domain/WeChat/WxClient.cs | 155 LifePayment/LifePayment.Domain.Shared/WeChat/WxPayOption.cs | 45 LifePayment/LifePayment.Domain/Common/ICommonManager.cs | 17 .vs/LiftPay/v17/DocumentLayout.json | 105 LifePayment/LifePayment.Domain/ACOOLY/ACOOLYManager.cs | 261 + LifePayment/LifePayment.Domain.Shared/AlipayModel/FundAccountQueryResponse.cs | 19 LifePayment/LifePayment.Domain.Shared/Enum/Wallet/WalletAmountOperateTypeEnum.cs | 33 LifePayment/LifePayment.Domain.Shared/Enum/Wallet/WalletTransactionStatusEnum.cs | 46 LifePayment/LifePayment.Domain/Ali/AlipayInterfaceManager.cs | 184 LifePayment/LifePayment.Domain.Shared/ACOOLY/ACOOLYInput.cs | 275 + LifePayment/LifePayment.Domain/ACOOLY/ACOOLYClient.cs | 107 LifePayment/LifePayment.Domain.Shared/AlipayModel/FundAccountBookQueryResponse.cs | 139 LifePayment/LifePayment.Domain.Shared/Wallet/WalletManagerInput.cs | 374 + LifePayment/LifePayment.Domain.Shared/AlipayModel/DataBillErceiptApplyInput.cs | 65 LifePayment/LifePayment.Domain.Shared/AlipayModel/FundAccountBookQueryInput.cs | 47 LifePayment/LifePayment.Domain/WeChat/WxPayAuthenticationHandler.cs | 82 LifePayment/LifePayment.Domain/Ali/IAliPayApi.cs | 15 LifePayment/LifePayment.Domain/LifePay/LifePayRate.cs | 17 LifePayment/LifePayment.Domain.Shared/Wallet/WalletConstant.cs | 36 LifePayment/LifePayment.Domain/WeChat/IWxManager.cs | 25 LifePayment/LifePayment.Domain.Shared/AlipayModel/NotifyUserAgreementPageSignInput.cs | 146 LifePayment/LifePayment.Domain.Shared/Common/OssSettings.cs | 31 LifePayment/LifePayment.HttpApi/LifePay/LifePayController.cs | 214 LifePayment/LifePayment.Domain.Shared/AlipayModel/AlipayBaseOutput.cs | 59 LifePayment/LifePayment.Domain.Shared/AlipayModel/FundTransOrderChangedContent.cs | 121 LifePayment/LifePayment.Domain/LifePay/LifePayOrder.cs | 102 LifePayment/LifePayment.Domain.Shared/WeChat/WxMatchMakingMiniAppOption.cs | 36 LifePayment/LifePayment.Domain.Shared/Enum/Wallet/WalletAccountOpenAlipayStatusEnum.cs | 33 LifePayment/LifePayment.Domain/WeChat/WxPayApi.cs | 34 LifePayment/LifePayment.Domain.Shared/AlipayModel/DataBillEreceiptQueryInput.cs | 70 LifePayment/LifePayment.Domain/Common/CommonManager.cs | 99 LifePayment/LifePayment.Domain.Shared/AlipayModel/AliPayEcsignInterfaceInput.cs | 523 ++ LifePayment/LifePayment.Domain.Shared/Information/InformationOption.cs | 20 LifePayment/LifePayment.Domain/Ali/IAlipayInterfaceManager.cs | 98 LifePayment/LifePayment.Domain.Shared/Extension/IQueryableExtensions.cs | 43 LifePayment/LifePayment.Domain/WeChat/IWxPayApi.cs | 26 LifePayment/LifePayment.Domain.Shared/AlipayModel/FundAccountbookCreateResponse.cs | 50 LifePayment/LifePayment.Domain.Shared/Enum/Wallet/WalletAccountOpenBindInterfaceStatusEnum.cs | 28 LifePayment/LifePayment.Application.Contracts/LifePay/ILifePayService.cs | 137 LifePayment/LifePayment.Domain.Shared/Enum/LifePay/LifePayEnum.cs | 51 LifePayment/LifePayment.Domain.Shared/Enum/Wallet/UnionFlagEnum.cs | 21 LifePayment/LifePayment.Domain.Shared/AlipayModel/FundTransUniTransferInput.cs | 116 LifePayment/LifePayment.Domain.Shared/AlipayModel/FundTransPagePayResponse.cs | 49 LifePayment/LifePayment.Host/LifePaymentServices.Application.Contracts.xml | 452 + LifePayment/LifePayment.Domain.Shared/Attribute/EnumValidationAttribute.cs | 45 LifePayment/LifePayment.Domain/Ali/IAlipayManager.cs | 15 LifePayment/LifePayment.Domain.Shared/ACOOLY/ACOOLYOption.cs | 20 LifePayment/LifePayment.Domain.Shared/WeChat/CreateQrCodeInput.cs | 167 LifePayment/LifePayment.Domain.Shared/WeChat/WxPayPostBaseModel.cs | 597 ++ LifePayment/LifePayment.Domain/Ali/AlipayApiConstant.cs | 36 LifePayment/LifePayment.Domain.Shared/Enum/Wx/WxMiniAppEnum.cs | 26 LifePayment/LifePayment.Domain.Shared/AlipayModel/FundTransCommonQueryInput.cs | 74 LifePayment/LifePayment.Domain.Shared/Enum/Wallet/WalletAccountOpenBankStatusEnum.cs | 23 LifePayment/LifePayment.Domain/WeChat/WxManager.cs | 184 LifePayment/LifePayment.Domain.Shared/Enum/Wallet/WalletAccountOpenBankSignStatusEnum.cs | 23 121 files changed, 14,912 insertions(+), 3 deletions(-) diff --git a/.vs/LiftPay/v17/.wsuo b/.vs/LiftPay/v17/.wsuo new file mode 100644 index 0000000..5a05eda --- /dev/null +++ b/.vs/LiftPay/v17/.wsuo Binary files differ diff --git a/.vs/LiftPay/v17/DocumentLayout.json b/.vs/LiftPay/v17/DocumentLayout.json new file mode 100644 index 0000000..042327a --- /dev/null +++ b/.vs/LiftPay/v17/DocumentLayout.json @@ -0,0 +1,105 @@ +{ + "Version": 1, + "WorkspaceRootPath": "D:\\Work\\LiftPay\\", + "Documents": [], + "DocumentGroupContainers": [ + { + "Orientation": 1, + "VerticalTabListWidth": 256, + "DocumentGroups": [ + { + "DockedHeight": 271, + "SelectedChildIndex": -1, + "Children": [ + { + "$type": "Bookmark", + "Name": "ST:128:0:{1fc202d4-d401-403c-9834-5b218574bb67}" + }, + { + "$type": "Bookmark", + "Name": "ST:138:0:{116d2292-e37d-41cd-a077-ebacac4c8cc4}" + }, + { + "$type": "Bookmark", + "Name": "ST:0:0:{1c4feeaa-4718-4aa9-859d-94ce25d182ba}" + }, + { + "$type": "Bookmark", + "Name": "ST:130:0:{1fc202d4-d401-403c-9834-5b218574bb67}" + }, + { + "$type": "Bookmark", + "Name": "ST:132:0:{1fc202d4-d401-403c-9834-5b218574bb67}" + }, + { + "$type": "Bookmark", + "Name": "ST:133:0:{1fc202d4-d401-403c-9834-5b218574bb67}" + }, + { + "$type": "Bookmark", + "Name": "ST:134:0:{1fc202d4-d401-403c-9834-5b218574bb67}" + }, + { + "$type": "Bookmark", + "Name": "ST:135:0:{1fc202d4-d401-403c-9834-5b218574bb67}" + }, + { + "$type": "Bookmark", + "Name": "ST:136:0:{1fc202d4-d401-403c-9834-5b218574bb67}" + }, + { + "$type": "Bookmark", + "Name": "ST:137:0:{1fc202d4-d401-403c-9834-5b218574bb67}" + }, + { + "$type": "Bookmark", + "Name": "ST:138:0:{1fc202d4-d401-403c-9834-5b218574bb67}" + }, + { + "$type": "Bookmark", + "Name": "ST:139:0:{1fc202d4-d401-403c-9834-5b218574bb67}" + }, + { + "$type": "Bookmark", + "Name": "ST:140:0:{1fc202d4-d401-403c-9834-5b218574bb67}" + }, + { + "$type": "Bookmark", + "Name": "ST:131:0:{116d2292-e37d-41cd-a077-ebacac4c8cc4}" + }, + { + "$type": "Bookmark", + "Name": "ST:129:0:{116d2292-e37d-41cd-a077-ebacac4c8cc4}" + }, + { + "$type": "Bookmark", + "Name": "ST:0:0:{aa2115a1-9712-457b-9047-dbb71ca2cdd2}" + }, + { + "$type": "Bookmark", + "Name": "ST:131:0:{1fc202d4-d401-403c-9834-5b218574bb67}" + }, + { + "$type": "Bookmark", + "Name": "ST:133:0:{116d2292-e37d-41cd-a077-ebacac4c8cc4}" + }, + { + "$type": "Bookmark", + "Name": "ST:132:0:{116d2292-e37d-41cd-a077-ebacac4c8cc4}" + } + ] + }, + { + "DockedHeight": 129, + "SelectedChildIndex": -1, + "Children": [ + { + "$type": "Bookmark", + "Name": "ST:0:0:{34e76e81-ee4a-11d0-ae2e-00a0c90fffc3}" + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/.vs/VSWorkspaceState.json b/.vs/VSWorkspaceState.json new file mode 100644 index 0000000..6b61141 --- /dev/null +++ b/.vs/VSWorkspaceState.json @@ -0,0 +1,6 @@ +{ + "ExpandedNodes": [ + "" + ], + "PreviewInSolutionExplorer": false +} \ No newline at end of file diff --git a/LifePayment/LifePayment.Application.Contracts/LifePay/ILifePayService.cs b/LifePayment/LifePayment.Application.Contracts/LifePay/ILifePayService.cs new file mode 100644 index 0000000..872a25d --- /dev/null +++ b/LifePayment/LifePayment.Application.Contracts/LifePay/ILifePayService.cs @@ -0,0 +1,137 @@ +锘縰sing LifePayment.Application.Contracts; +using LifePayment.Domain; +using LifePayment.Domain.Shared; +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.Logging; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Volo.Abp; +using Volo.Abp.Application.Services; +using Volo.Abp.Domain.Repositories; +using Volo.Abp.EventBus.Distributed; +using ZeroD.Util; +using static LifePayment.Domain.Shared.LifePaymentConstant; + +namespace LifePayment.Application.Contracts; + +public interface ILifePayService : IApplicationService +{ + /// <summary> + /// 鑾峰彇鐢佃垂闈㈠�� + /// </summary> + /// <returns></returns> + Task<ElectricParValueResponse> GetElectricParValue(); + + /// <summary> + /// 鑾峰彇鐢佃垂鍏呭�煎尯鍩� + /// </summary> + /// <returns></returns> + Task<ElectricSupportAreaResponse> GetElectricSupportArea(); + + /// <summary> + /// 鑾峰彇璇濊垂闈㈠�� + /// </summary> + /// <returns></returns> + Task<PhoneParValueResponse> GetPhoneParValue(); + + /// <summary> + /// 鏀粯鎴愬姛鍥炶皟澶勭悊 + /// </summary> + /// <param name="orderNo"></param> + /// <param name="outOrderNo"></param> + /// <returns></returns> + Task LifePaySuccessHandler(string orderNo, string outOrderNo); + + /// <summary> + /// 鏀粯鎴愬姛鍥炶皟澶勭悊 + /// </summary> + /// <param name="orderNo"></param> + /// <param name="acoolyOrderNo"></param> + /// <param name="status"></param> + /// <returns></returns> + Task ACOOLYOrderNotifyHandler(string orderNo, string acoolyOrderNo, LifePayOrderStatusEnum status); + + /// <summary> + /// 鍒涘缓鐢熸椿缂磋垂璇濊垂璁㈠崟 + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + Task<CreateLifePayOrderOutput> CreateLifePayPhoneOrder(CreateLifePayOrderInput<LifePhoneData> input); + + /// <summary> + /// 鍒涘缓鐢熸椿缂磋垂鐢佃垂璁㈠崟 + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + Task<CreateLifePayOrderOutput> CreateLifePayElectricOrder(CreateLifePayOrderInput<LifeElectricData> input); + + /// <summary> + /// 閫�娆剧敓娲荤即璐硅鍗� + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + /// <exception cref="UserFriendlyException"></exception> + Task RefundLifePayOrder(RefundLifePayOrderInput input); + + /// <summary> + /// 鑾峰彇鎶樻墸 + /// </summary> + /// <returns></returns> + Task<List<LifePayRateListOutput>> GetRate(); + + /// <summary> + /// 鑾峰彇鎴戠殑璁㈠崟鍒嗛〉鏁版嵁 + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + Task<PageOutput<UserLifePayOrderOutput>> GetUserLifePayOrderPage(QueryLifePayOrderListInput input); + + /// <summary> + /// 鑾峰彇鐢ㄦ埛鍒嗛〉鏁版嵁 + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + Task<PageOutput<UserListOutput>> GetUserPage(PageInput input); + + /// <summary> + /// 鑾峰彇璁㈠崟鍒嗛〉鏁版嵁 + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + Task<PageOutput<LifePayOrderListOutput>> GetLifePayOrderPage(QueryLifePayOrderListInput input); + + /// <summary> + /// 鏍规嵁璁㈠崟鍙疯幏鍙栨敮浠樼姸鎬� + /// </summary> + /// <param name="orderNo"></param> + /// <returns></returns> + Task<LifePayStatusEnum> GetPayStatusByOrderNo(string orderNo); + + /// <summary> + /// 璁剧疆鐢熸椿缂磋垂鏀粯绫诲瀷 + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + Task<string> SetLifePayOrderPayType(SetLifePayOrderPayTypeInput input, string ip); + + /// <summary> + /// 鐢熸椿缂磋垂鐨凧SAPI璋冪敤 + /// </summary> + /// <param name="input"></param> + /// <param name="ip"></param> + /// <returns></returns> + Task<ModelPaymentMiniPay> GetPayOrderForJsAPI(GetPayOrderForJsAPIInput input, string ip); + + /// <summary> + /// 鑾峰彇鏀粯浜岀淮鐮� + /// </summary> + /// <param name="payType"></param> + /// <param name="outTradeNo"></param> + /// <param name="description"></param> + /// <param name="amount"></param> + /// <returns></returns> + /// <exception cref="UserFriendlyException"></exception> + Task<string> GetPayQRCode(LifePayTypeEnum payType, string outTradeNo, string description, decimal amount, string ip, string h5Type); +} \ No newline at end of file diff --git a/LifePayment/LifePayment.Application.Contracts/LifePay/LifePayInput.cs b/LifePayment/LifePayment.Application.Contracts/LifePay/LifePayInput.cs new file mode 100644 index 0000000..ff0ce6d --- /dev/null +++ b/LifePayment/LifePayment.Application.Contracts/LifePay/LifePayInput.cs @@ -0,0 +1,227 @@ +锘縰sing LifePayment.Domain.Shared; +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using ZeroD.Util; + +namespace LifePayment.Application.Contracts; + +public class CreateLifePayOrderInput<T> where T : class +{ + public Guid UserId { get; set; } + + ///// <summary> + ///// 鐢熸椿缂磋垂鏀粯绫诲瀷 + ///// </summary> + //[EnumValidation(typeof(LifePayTypeEnum), ErrorMessage = "鏀粯绫诲瀷寮傚父")] + //public LifePayTypeEnum LifePayType { get; set; } + + public T ProductData { get; set; } +} + +public class LifePhoneData +{ + /// <summary> + /// 杩愯惀鍟嗙紪鐮侊紝渚嬪锛�"yidong", "dianxin", "liantong"銆� + /// </summary> + [Required(ErrorMessage = "杩愯惀鍟嗙紪鐮佹槸蹇呭~椤广��")] + public string IspCode { get; set; } + + /// <summary> + /// 鍏呭�奸潰棰濓紝鍗曚綅涓哄厓銆傛祴璇曡处鎴凤細parValue=100:缂磋垂鎴愬姛锛宲arValue>100锛氱即璐瑰け璐ャ�� + /// </summary> + [Required(ErrorMessage = "鍏呭�奸潰棰濇槸蹇呭~椤广��")] + [Range(0.1, double.MaxValue, ErrorMessage = "鍏呭�奸潰棰濆紓甯�")] + public decimal ParValue { get; set; } + + /// <summary> + /// 鎵嬫満鍙枫�� + /// </summary> + [Required(ErrorMessage = "鎵嬫満鍙锋槸蹇呭~椤广��")] + [JsonProperty("phone")] + public string Phone { get; set; } + + /// <summary> + /// 鏈轰富鍚嶇О(鐢典俊鎵嬫満鍙峰繀濉�) + /// </summary> + [JsonProperty("name")] + public string Name { get; set; } +} + +public class LifeElectricData +{ + /// <summary> + /// 鍏呭�奸潰棰濓紝鍗曚綅涓哄厓銆� + /// </summary> + [Required(ErrorMessage = "鍏呭�奸潰棰濇槸蹇呭~椤广��")] + public decimal ParValue { get; set; } + + /// <summary> + /// 鐢电綉绫诲瀷锛屼緥濡傦細"guowang"浠h〃鍥藉鐢电綉锛�"nanwang"浠h〃鍗楁柟鐢电綉銆� + /// </summary> + [Required(ErrorMessage = "鐢电綉绫诲瀷鏄繀濉」銆�")] + public string ElectricType { get; set; } + + /// <summary> + /// 鐢佃垂绫诲瀷锛屽浗缃戝繀浼狅細浣忓畢銆佷紒浜嬩笟銆佸簵閾轰笁涓�夐」銆� + /// </summary> + [Required(ErrorMessage = "鐢佃垂绫诲瀷鏄繀濉」銆�")] + [StringLength(20, ErrorMessage = "鐢佃垂绫诲瀷闀垮害涓嶈兘瓒呰繃20涓瓧绗︺��")] + public string ElectricAccountType { get; set; } + + /// <summary> + /// 鐢佃垂鎴峰彿銆� + /// </summary> + [Required(ErrorMessage = "鐢佃垂鎴峰彿鏄繀濉」銆�")] + [StringLength(50, ErrorMessage = "鐢佃垂鎴峰彿闀垮害涓嶈兘瓒呰繃50涓瓧绗︺��")] + public string ElectricAccount { get; set; } + + /// <summary> + /// 鐪佷唤銆� + /// </summary> + [Required(ErrorMessage = "鐪佷唤鏄繀濉」銆�")] + [StringLength(20, ErrorMessage = "鐪佷唤闀垮害涓嶈兘瓒呰繃20涓瓧绗︺��")] + public string Province { get; set; } + + /// <summary> + /// 鍩庡競銆� + /// </summary> + //[Required(ErrorMessage = "鍩庡競鏄繀濉」銆�")] + [StringLength(20, ErrorMessage = "鍩庡競闀垮害涓嶈兘瓒呰繃20涓瓧绗︺��")] + public string City { get; set; } + + /// <summary> + /// 瀹㈡埛韬唤璇佸悗6浣嶏紝鍗楃綉蹇呬紶銆� + /// </summary> + public string SixID { get; set; } +} + +public class CreateLifePayOrderInput +{ + public Guid? UserId { get; set; } + + /// <summary> + /// 鐢ㄦ埛鎵嬫満鍙� + /// </summary> + public string PhoneNumber { get; set; } + + ///// <summary> + ///// 鐢熸椿缂磋垂鏀粯绫诲瀷 + ///// </summary> + //public LifePayTypeEnum LifePayType { get; set; } + + /// <summary> + /// 璁㈠崟绫诲瀷 + /// </summary> + public LifePayOrderTypeEnum LifePayOrderType { get; set; } + + /// <summary> + /// 璁㈠崟鍙� + /// </summary> + public string OrderNo { get; set; } + + /// <summary> + /// 鍏呭�奸噾棰� + /// </summary> + public decimal RechargeAmount { get; set; } + + /// <summary> + /// 浼樻儬閲戦 + /// </summary> + public decimal DiscountAmount { get; set; } + + /// <summary> + /// 瀹炰粯閲戦 + /// </summary> + public decimal PayAmount { get; set; } + + /// <summary> + /// 鏀粯鏃堕棿 + /// </summary> + public DateTime? PayTime { get; set; } + + /// <summary> + /// 鏀粯鐘舵�� + /// </summary> + public LifePayStatusEnum PayStatus { get; set; } + + /// <summary> + /// 澶栭儴璁㈠崟鍙� + /// </summary> + public string OutOrderNo { get; set; } + + /// <summary> + /// 璁㈠崟鐘舵�� + /// </summary> + public LifePayOrderStatusEnum LifePayOrderStatus { get; set; } + + /// <summary> + /// 瀹屾垚鏃堕棿 + /// </summary> + public DateTime? FinishTime { get; set; } + + /// <summary> + /// 閫�娆惧嚟璇� + /// </summary> + public string RefundCredentialsImgUrl { get; set; } + + /// <summary> + /// 璁㈠崟鍙傛暟璇︽儏 + /// </summary> + public string OrderParamDetailJsonStr { get; set; } + +} + +public class QueryLifePayOrderListInput : PageInput +{ + /// <summary> + /// 璁㈠崟绫诲瀷 + /// </summary> + public LifePayOrderTypeEnum? LifePayOrderType { get; set; } + + /// <summary> + /// 寮�濮嬫敮浠樻椂闂� + /// </summary> + public DateTime? BeginPayTime { get; set; } + + /// <summary> + /// 缁撴潫鏀粯鏃堕棿 + /// </summary> + public DateTime? EndPayTime { get; set; } + + /// <summary> + /// 鏀粯鐘舵�� + /// </summary> + public LifePayStatusEnum? PayStatus { get; set; } + + /// <summary> + /// 璁㈠崟鐘舵�� + /// </summary> + public LifePayOrderStatusEnum? LifePayOrderStatus { get; set; } + + /// <summary> + /// 寮�濮嬪畬鎴愭椂闂� + /// </summary> + public DateTime? BeginFinishTime { get; set; } + + /// <summary> + /// 缁撴潫瀹屾垚鏃堕棿 + /// </summary> + public DateTime? EndFinishTime { get; set; } + + /// <summary> + /// 鐢ㄦ埛Id + /// </summary> + public Guid? UserId { get; set; } +} + +public class RefundLifePayOrderInput +{ + public Guid Id { get; set; } + + public string RefundCredentialsImgUrl { get; set; } +} \ No newline at end of file diff --git a/LifePayment/LifePayment.Application.Contracts/LifePay/LifePayOutput.cs b/LifePayment/LifePayment.Application.Contracts/LifePay/LifePayOutput.cs new file mode 100644 index 0000000..62aed58 --- /dev/null +++ b/LifePayment/LifePayment.Application.Contracts/LifePay/LifePayOutput.cs @@ -0,0 +1,182 @@ +锘縰sing LifePayment.Domain.Shared; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using ZeroD.Util; + +namespace LifePayment.Application.Contracts; + +public class LifePayRateListOutput +{ + public LifePayRateTypeEnum RateType { get; set; } + + public decimal Rate { get; set; } +} + +public class UserListOutput +{ + public Guid Id { get; set; } + + /// <summary> + /// 鐢ㄦ埛鎵嬫満鍙� + /// </summary> + public string PhoneNumber { get; set; } + + public DateTime? LastLoginTime { get; set; } + + public DateTime? CreationTime { get; set; } +} + +public class LifePayOrderListOutput +{ + public Guid Id { get; set; } + + public Guid? UserId { get; set; } + + /// <summary> + /// 鐢ㄦ埛鎵嬫満鍙� + /// </summary> + public string PhoneNumber { get; set; } + + /// <summary> + /// 鐢熸椿缂磋垂鏀粯绫诲瀷 + /// </summary> + public LifePayTypeEnum? LifePayType { get; set; } + + /// <summary> + /// 璁㈠崟绫诲瀷 + /// </summary> + public LifePayOrderTypeEnum LifePayOrderType { get; set; } + + /// <summary> + /// 璁㈠崟鍙� + /// </summary> + public string OrderNo { get; set; } + + /// <summary> + /// 鍏呭�奸噾棰� + /// </summary> + public decimal RechargeAmount { get; set; } + + /// <summary> + /// 浼樻儬閲戦 + /// </summary> + public decimal DiscountAmount { get; set; } + + /// <summary> + /// 瀹炰粯閲戦 + /// </summary> + public decimal PayAmount { get; set; } + + /// <summary> + /// 鏀粯鏃堕棿 + /// </summary> + public DateTime? PayTime { get; set; } + + /// <summary> + /// 鏀粯鐘舵�� + /// </summary> + public LifePayStatusEnum PayStatus { get; set; } + + /// <summary> + /// 澶栭儴璁㈠崟鍙� + /// </summary> + public string OutOrderNo { get; set; } + + /// <summary> + /// 璁㈠崟鐘舵�� + /// </summary> + public LifePayOrderStatusEnum LifePayOrderStatus { get; set; } + + /// <summary> + /// 瀹屾垚鏃堕棿 + /// </summary> + public DateTime? FinishTime { get; set; } + + /// <summary> + /// 閫�娆惧嚟璇� + /// </summary> + public string RefundCredentialsImgUrl { get; set; } + + /// <summary> + /// 涓嬪崟鏃堕棿 + /// </summary> + public DateTime CreationTime { get; set; } +} + +public class UserLifePayOrderOutput +{ + public Guid Id { get; set; } + + /// <summary> + /// 鐢熸椿缂磋垂鏀粯绫诲瀷 + /// </summary> + public LifePayTypeEnum? LifePayType { get; set; } + + /// <summary> + /// 璁㈠崟绫诲瀷 + /// </summary> + public LifePayOrderTypeEnum LifePayOrderType { get; set; } + + /// <summary> + /// 璁㈠崟鍙� + /// </summary> + public string OrderNo { get; set; } + + /// <summary> + /// 鍏呭�奸噾棰� + /// </summary> + public decimal RechargeAmount { get; set; } + + /// <summary> + /// 浼樻儬閲戦 + /// </summary> + public decimal DiscountAmount { get; set; } + + /// <summary> + /// 瀹炰粯閲戦 + /// </summary> + public decimal PayAmount { get; set; } + + /// <summary> + /// 鏀粯鏃堕棿 + /// </summary> + public DateTime? PayTime { get; set; } + + /// <summary> + /// 鏀粯鐘舵�� + /// </summary> + public LifePayStatusEnum PayStatus { get; set; } + + /// <summary> + /// 璁㈠崟鐘舵�� + /// </summary> + public LifePayOrderStatusEnum LifePayOrderStatus { get; set; } + + /// <summary> + /// 瀹屾垚鏃堕棿 + /// </summary> + public DateTime? FinishTime { get; set; } + + /// <summary> + /// 璁㈠崟璇︾粏鏁版嵁 + /// </summary> + public string OrderParamDetailJsonStr { get; set; } + + /// <summary> + /// 涓嬪崟鏃堕棿 + /// </summary> + public DateTime? CreationTime { get; set; } + + /// <summary> + /// 閫�娆炬椂闂� + /// </summary> + public DateTime? RefundTime { get; set; } +} + +public class CreateLifePayOrderOutput +{ + public string OrderNo { get; set; } +} \ No newline at end of file diff --git a/LifePayment/LifePayment.Application.Contracts/RecordOperateHistoryEto.cs b/LifePayment/LifePayment.Application.Contracts/RecordOperateHistoryEto.cs new file mode 100644 index 0000000..22c0c1e --- /dev/null +++ b/LifePayment/LifePayment.Application.Contracts/RecordOperateHistoryEto.cs @@ -0,0 +1,47 @@ +锘縰sing System; +using System.Collections.Generic; + +namespace LifePayment.Application.Contracts; + +public class RecordOperateHistoryEto +{ + /// <summary> + /// 鍏宠仈鍏崇郴ID + /// </summary> + public Guid RelationId { get; set; } + + /// <summary> + /// 琛ㄧ被鍨� 甯搁噺 TableType + /// </summary> + public int? TableType { get; set; } + + /// <summary> + /// 鎿嶄綔鍚嶇О + /// </summary> + public string OperateName { get; set; } + + /// <summary> + /// 鎿嶄綔鍐呭 + /// </summary> + public string OperateContent { get; set; } + + /// <summary> + /// 鎿嶄綔浜� + /// </summary> + public string CreatorName { get; set; } + + /// <summary> + /// 鎿嶄綔缁嗚妭 + /// </summary> + public string OperateDetail { get; set; } + + /// <summary> + /// 鐢ㄦ埛id + /// </summary> + public Guid? UserId { get; set; } +} + +public class RecordOperateHistoryListEto +{ + public List<RecordOperateHistoryEto> DataList { get; set; } +} \ No newline at end of file diff --git a/LifePayment/LifePayment.Application/LifePay/LifePayService.cs b/LifePayment/LifePayment.Application/LifePay/LifePayService.cs new file mode 100644 index 0000000..8f950fe --- /dev/null +++ b/LifePayment/LifePayment.Application/LifePay/LifePayService.cs @@ -0,0 +1,838 @@ +锘縰sing DynamicQuery.Net.Dto.Input; +using LifePayment.Application.Contracts; +using LifePayment.Domain; +using LifePayment.Domain.Models; +using LifePayment.Domain.Shared; +using MailKit.Search; +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; +using Nest; +using Newtonsoft.Json; +using NPOI.OpenXmlFormats.Dml.Chart; +using NPOI.SS.Formula.Functions; +using StackExchange.Redis; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Security.Cryptography; +using System.Threading.Tasks; +using Volo.Abp; +using Volo.Abp.Application.Services; +using Volo.Abp.Domain.Entities; +using Volo.Abp.Domain.Repositories; +using Volo.Abp.EventBus.Distributed; +using ZeroD.Util; +using ZeroD.Util.Fadd; +using static LifePayment.Domain.Shared.LifePaymentConstant; +using static IdentityServer4.Models.IdentityResources; + +namespace LifePayment.Application; + +public class LifePayService : ApplicationService, ILifePayService +{ + private readonly IDistributedEventBus _distributedEventBus; + private readonly ILogger<LifePayService> _logger; + + private readonly IRepository<LifePayRate, Guid> _lifePayRateRepository; + private readonly IRepository<LifePayOrder, Guid> _lifePayOrderRepository; + private readonly IRepository<LifePayUser, Guid> _lifePayUserRepository; + + private readonly IAliPayApi _aliPayApi; + private readonly IWxPayApi _wxPayApi; + private readonly WxPayOption _wxPayOptions; + + private readonly IACOOLYManager _aCOOLYManager; + + public LifePayService(IDistributedEventBus distributedEventBus, + ILogger<LifePayService> logger, + IACOOLYManager aCOOLYManager, + IRepository<LifePayRate, Guid> lifePayRateRepository, + IRepository<LifePayOrder, Guid> lifePayOrderRepository, + IRepository<LifePayUser, Guid> lifePayUserRepository, + IAliPayApi aliPayApi, + IWxPayApi wxPayApi, + IOptions<WxPayOption> wxPayOptions) + { + _logger = logger; + _aCOOLYManager = aCOOLYManager; + _lifePayRateRepository = lifePayRateRepository; + _lifePayOrderRepository = lifePayOrderRepository; + _lifePayUserRepository = lifePayUserRepository; + _aliPayApi = aliPayApi; + _wxPayApi = wxPayApi; + _wxPayOptions = wxPayOptions.Value; + _distributedEventBus = distributedEventBus; + } + + #region 鏌ヨ + + /// <summary> + /// 鑾峰彇鐢佃垂闈㈠�� + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + public async Task<ElectricParValueResponse> GetElectricParValue() + { + return await _aCOOLYManager.ElectricParValue(new ACOOLYRequestBaseInput()); + } + + /// <summary> + /// 鑾峰彇鐢佃垂鍏呭�煎尯鍩� + /// </summary> + /// <returns></returns> + public async Task<ElectricSupportAreaResponse> GetElectricSupportArea() + { + return await _aCOOLYManager.GetElectricSupportArea(new ACOOLYRequestBaseInput()); + } + + /// <summary> + /// 鑾峰彇璇濊垂闈㈠�� + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + public async Task<PhoneParValueResponse> GetPhoneParValue() + { + return await _aCOOLYManager.PhoneParValue(new ACOOLYRequestBaseInput()); + } + + /// <summary> + /// 鑾峰彇鎶樻墸 + /// </summary> + /// <returns></returns> + public async Task<List<LifePayRateListOutput>> GetRate() + { + return await _lifePayRateRepository.Select(x => new LifePayRateListOutput() { Rate = x.Rate, RateType = x.RateType }) + .ToListAsync(); + } + + /// <summary> + /// 鑾峰彇鐢ㄦ埛鍒嗛〉鏁版嵁 + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + public async Task<PageOutput<UserListOutput>> GetUserPage(PageInput input) + { + return await _lifePayUserRepository.Select(x => + new UserListOutput() + { + Id = x.Id, + PhoneNumber = x.PhoneNumber, + CreationTime = x.CreationTime, + LastLoginTime = x.LastLoginTime + }) + .GetPageResult(input.PageModel); + } + + /// <summary> + /// 鑾峰彇璁㈠崟鍒嗛〉鏁版嵁 + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + public async Task<PageOutput<LifePayOrderListOutput>> GetLifePayOrderPage(QueryLifePayOrderListInput input) + { + return await _lifePayOrderRepository.Where(x => x.PayStatus != LifePayStatusEnum.鏈敮浠�) + .WhereIf(input.BeginFinishTime.HasValue, x => x.FinishTime >= input.BeginFinishTime) + .WhereIf(input.EndFinishTime.HasValue, x => x.FinishTime <= input.EndFinishTime) + .WhereIf(input.BeginPayTime.HasValue, x => x.PayTime >= input.BeginPayTime) + .WhereIf(input.EndPayTime.HasValue, x => x.PayTime <= input.EndPayTime) + .WhereIf(input.LifePayOrderStatus.HasValue, x => x.LifePayOrderStatus == input.LifePayOrderStatus.Value) + .WhereIf(input.PayStatus.HasValue, x => x.PayStatus == input.PayStatus.Value) + .WhereIf(input.LifePayOrderType.HasValue, x => x.LifePayOrderType == input.LifePayOrderType.Value) + .WhereIf(input.UserId.HasValue, x => x.UserId == input.UserId.Value) + .Select(x => + new LifePayOrderListOutput + { + DiscountAmount = x.DiscountAmount, + FinishTime = x.FinishTime, + Id = x.Id, + LifePayOrderStatus = x.LifePayOrderStatus, + LifePayOrderType = x.LifePayOrderType, + LifePayType = x.LifePayType, + OrderNo = x.OrderNo, + PayAmount = x.PayAmount, + PhoneNumber = x.PhoneNumber, + RechargeAmount = x.RechargeAmount, + UserId = x.UserId, + OutOrderNo = x.OutOrderNo, + PayStatus = x.PayStatus, + PayTime = x.PayTime, + RefundCredentialsImgUrl = x.RefundCredentialsImgUrl, + CreationTime = x.CreationTime + }) + .GetPageResult(input.PageModel); + } + + /// <summary> + /// 鑾峰彇鎴戠殑璁㈠崟鍒嗛〉鏁版嵁 + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + public async Task<PageOutput<UserLifePayOrderOutput>> GetUserLifePayOrderPage(QueryLifePayOrderListInput input) + { + if (!input.UserId.HasValue) + { + return new PageOutput<UserLifePayOrderOutput>(); + } + + return await _lifePayOrderRepository.Where(x => x.PayStatus != LifePayStatusEnum.鏈敮浠�) + .WhereIf(input.BeginFinishTime.HasValue, x => x.FinishTime >= input.BeginFinishTime) + .WhereIf(input.EndFinishTime.HasValue, x => x.FinishTime <= input.EndFinishTime) + .WhereIf(input.BeginPayTime.HasValue, x => x.PayTime >= input.BeginPayTime) + .WhereIf(input.EndPayTime.HasValue, x => x.PayTime <= input.EndPayTime) + .WhereIf(input.LifePayOrderStatus.HasValue, x => x.LifePayOrderStatus == input.LifePayOrderStatus.Value) + .WhereIf(input.PayStatus.HasValue, x => x.PayStatus == input.PayStatus.Value) + .WhereIf(input.UserId.HasValue, x => x.UserId == input.UserId.Value) + .WhereIf(input.LifePayOrderType.HasValue, x => x.LifePayOrderType == input.LifePayOrderType) + .Select(x => + new UserLifePayOrderOutput + { + DiscountAmount = x.DiscountAmount, + FinishTime = x.FinishTime, + Id = x.Id, + LifePayOrderStatus = x.LifePayOrderStatus, + LifePayOrderType = x.LifePayOrderType, + LifePayType = x.LifePayType, + OrderNo = x.OrderNo, + PayAmount = x.PayAmount, + RechargeAmount = x.RechargeAmount, + PayStatus = x.PayStatus, + PayTime = x.PayTime, + OrderParamDetailJsonStr = x.OrderParamDetailJsonStr, + CreationTime = x.CreationTime, + RefundTime = x.RefundTime + }) + .GetPageResult(input.PageModel); + } + + /// <summary> + /// 鏍规嵁璁㈠崟鍙疯幏鍙栨敮浠樼姸鎬� + /// </summary> + /// <param name="orderNo"></param> + /// <returns></returns> + public async Task<LifePayStatusEnum> GetPayStatusByOrderNo(string orderNo) + { + return await _lifePayOrderRepository.Where(x => x.OrderNo == orderNo) + .Select(x => x.PayStatus) + .FirstOrDefaultAsync(); + } + + #endregion + + #region 鎿嶄綔 + + /// <summary> + /// 鍒涘缓鐢熸椿缂磋垂璇濊垂璁㈠崟 + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + public async Task<CreateLifePayOrderOutput> CreateLifePayPhoneOrder(CreateLifePayOrderInput<LifePhoneData> input) + { + var user = await _lifePayUserRepository.FirstOrDefaultAsync(x => x.Id == input.UserId); + CheckExtensions.IfTrueThrowUserFriendlyException(user == null, "鐢ㄦ埛涓嶅瓨鍦紝璇峰厛鐧诲綍鍐嶆搷浣�"); + + var rate = await GetRate(); + CheckExtensions.IfTrueThrowUserFriendlyException(rate.IsNullOrEmpty(), "鏈厤缃姌鎵�"); + + var amount = CalculateAmount(input.ProductData.ParValue, rate.FirstOrDefault(x => x.RateType == LifePayRateTypeEnum.榛樿璇濊垂鎶樻墸).Rate); + + var orderInput = new CreateLifePayOrderInput + { + OrderNo = CreateOrderNo(), + LifePayOrderStatus = LifePayOrderStatusEnum.寰呯‘璁�, + LifePayOrderType = LifePayOrderTypeEnum.璇濊垂璁㈠崟, + //LifePayType = input.LifePayType, + OrderParamDetailJsonStr = JsonConvert.SerializeObject(input.ProductData), + UserId = user.Id, + PayStatus = LifePayStatusEnum.鏈敮浠�, + PhoneNumber = user.PhoneNumber, + PayAmount = amount.PayAmont, + DiscountAmount = amount.DiscountAmount, + RechargeAmount = amount.RechargeAmount, + }; + + await CreateLifePayOrder(orderInput); + + var result = new CreateLifePayOrderOutput() + { + OrderNo = orderInput.OrderNo, + }; + return result; + } + + /// <summary> + /// 鍒涘缓鐢熸椿缂磋垂鐢佃垂璁㈠崟 + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + public async Task<CreateLifePayOrderOutput> CreateLifePayElectricOrder(CreateLifePayOrderInput<LifeElectricData> input) + { + var user = await _lifePayUserRepository.FirstOrDefaultAsync(x => x.Id == input.UserId); + CheckExtensions.IfTrueThrowUserFriendlyException(user == null, "鐢ㄦ埛涓嶅瓨鍦紝璇峰厛鐧诲綍鍐嶆搷浣�"); + + var rate = await GetRate(); + CheckExtensions.IfTrueThrowUserFriendlyException(rate.IsNullOrEmpty(), "鏈厤缃姌鎵�"); + + var amount = CalculateAmount(input.ProductData.ParValue, rate.FirstOrDefault(x => x.RateType == LifePayRateTypeEnum.榛樿鐢佃垂鎶樻墸).Rate); + + var orderInput = new CreateLifePayOrderInput + { + OrderNo = CreateOrderNo(), + LifePayOrderStatus = LifePayOrderStatusEnum.寰呯‘璁�, + LifePayOrderType = LifePayOrderTypeEnum.鐢佃垂璁㈠崟, + // LifePayType = input.LifePayType, + OrderParamDetailJsonStr = JsonConvert.SerializeObject(input.ProductData), + UserId = user.Id, + PayStatus = LifePayStatusEnum.鏈敮浠�, + PhoneNumber = user.PhoneNumber, + PayAmount = amount.PayAmont, + DiscountAmount = amount.DiscountAmount, + RechargeAmount = amount.RechargeAmount, + }; + + await CreateLifePayOrder(orderInput); + + var result = new CreateLifePayOrderOutput() + { + OrderNo = orderInput.OrderNo, + }; + return result; + } + + /// <summary> + /// 璁剧疆鐢熸椿缂磋垂鏀粯绫诲瀷 + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + public async Task<string> SetLifePayOrderPayType(SetLifePayOrderPayTypeInput input, string ip) + { + var order = await _lifePayOrderRepository.Where(x => x.OrderNo == input.OrderNo).FirstOrDefaultAsync(); + CheckExtensions.IfTrueThrowUserFriendlyException(order == null, "璁㈠崟涓嶅瓨鍦�"); + + CheckExtensions.IfTrueThrowUserFriendlyException(order.LifePayType.HasValue, "褰撳墠璁㈠崟宸查�夋嫨鏀粯绫诲瀷"); + + order.LifePayType = input.LifePayType; + + await _lifePayOrderRepository.UpdateAsync(order); + + var desc = "鐢熸椿缂磋垂-"; + switch (order.LifePayOrderType) + { + case LifePayOrderTypeEnum.璇濊垂璁㈠崟: + desc += "璇濊垂"; + break; + case LifePayOrderTypeEnum.鐢佃垂璁㈠崟: + desc += "鐢佃垂"; + break; + default: + break; + } + +#if DEBUG + //var payUrl = await GetPayQRCode(order.LifePayType.Value, order.OrderNo, desc, 0.01m, ip, input.H5Type); + var payUrl = await GetPayQRCode(order.LifePayType.Value, order.OrderNo, desc, order.PayAmount, ip, input.H5Type); +#else + //var payUrl = await GetPayQRCode(order.LifePayType.Value, order.OrderNo, desc, 0.01m, ip, input.H5Type); + var payUrl = await GetPayQRCode(order.LifePayType.Value, order.OrderNo, desc, order.PayAmount, ip, input.H5Type); +#endif + + return payUrl; + } + + /// <summary> + /// 璁剧疆鐢熸椿缂磋垂鏀粯绫诲瀷 + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + public async Task<ModelPaymentMiniPay> GetPayOrderForJsAPI(GetPayOrderForJsAPIInput input, string ip) + { + var order = await _lifePayOrderRepository.Where(x => x.OrderNo == input.OrderNo).FirstOrDefaultAsync(); + CheckExtensions.IfTrueThrowUserFriendlyException(order == null, "璁㈠崟涓嶅瓨鍦�"); + + CheckExtensions.IfTrueThrowUserFriendlyException(order.LifePayType.HasValue, "褰撳墠璁㈠崟宸查�夋嫨鏀粯绫诲瀷"); + + order.LifePayType = input.LifePayType; + await _lifePayOrderRepository.UpdateAsync(order); + + var desc = "鐢熸椿缂磋垂-"; + switch (order.LifePayOrderType) + { + case LifePayOrderTypeEnum.璇濊垂璁㈠崟: + desc += "璇濊垂"; + break; + case LifePayOrderTypeEnum.鐢佃垂璁㈠崟: + desc += "鐢佃垂"; + break; + default: + break; + } + + + //var result = await PayTransactionsJsAPI(input.OpenId, input.Attach, 0.01m, input.OrderNo, desc); + //return result; + + // var result = await PayTransactionsJsAPI(input.OpenId, input.Attach, order.PayAmount, input.OrderNo, desc); + + var result = await PayTransactionsJsAPI(input.OpenId, input.Attach, order.PayAmount, input.OrderNo, desc); + return result; + //var payUrl = await GetPayQRCode(order.LifePayType.Value, order.OrderNo, desc, 0.01m, ip, input.H5Type); + //var payUrl = await GetPayQRCode(order.LifePayType.Value, order.OrderNo, desc, order.PayAmount, ip, input.H5Type); + + + + } + + /// <summary> + /// 鍒涘缓鐢熸椿缂磋垂璁㈠崟 + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + public async Task CreateLifePayOrder(CreateLifePayOrderInput input) + { + CheckExtensions.IfTrueThrowUserFriendlyException(input.RechargeAmount < 0.01m || input.PayAmount < 0.01m || input.DiscountAmount < 0, "璁㈠崟閲戦閿欒"); + + var entity = ObjectMapper.Map<CreateLifePayOrderInput, LifePayOrder>(input); + await _lifePayOrderRepository.InsertAsync(entity); + } + + /// <summary> + /// 鍒涘缓ACOOLY璇濊垂璁㈠崟 + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + public async Task<(string Code, string RequestNo, string ACOOLYOrderNo)> CreateACOOLYPhoneOrder(LifePhoneData input, string orderNo) + { + var requestInput = new ConfirmPhoneOrderRequestInput() + { + IspCode = input.IspCode, + ParValue = input.ParValue, + Phone = input.Phone, + OutOrderNo = orderNo, + Name = input.Name + }; + var result = await _aCOOLYManager.ConfirmPhoneOrder(requestInput); +#if DEBUG + + _logger.LogInformation($"CreateACOOLYPhoneOrder:{JsonConvert.SerializeObject(result)}"); + +#endif + + CheckExtensions.IfTrueThrowUserFriendlyException(!result.Success || (result.Code != ACOOLYConstant.Code.SUCCESS && result.Code != ACOOLYConstant.Code.PROCESSING), + "璋冪敤ACOOLY鎺ュ彛ConfirmElectricOrder杩斿洖閿欒:" + JsonConvert.SerializeObject(result)); + + return (result.Code, requestInput.RequestNo, result.PhoneChargeOrder.BusiOrderNo); + } + + /// <summary> + /// 鍒涘缓ACOOLY鐢佃垂璁㈠崟 + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + public async Task<(string Code, string RequestNo, string ACOOLYOrderNo)> CreateACOOLYElectricOrder(LifeElectricData input, string orderNo) + { + var requestInput = new ConfirmElectricOrderRequestInput() + { + City = input.City, + ElectricAccount = input.ElectricAccount, + ElectricAccountType = input.ElectricAccountType, + ElectricType = input.ElectricType, + ParValue = input.ParValue, + Province = input.Province, + SixID = input.SixID, + OutOrderNo = orderNo + }; + var result = await _aCOOLYManager.ConfirmElectricOrder(requestInput); +#if DEBUG + + _logger.LogInformation($"CreateACOOLYElectricOrder:{JsonConvert.SerializeObject(result)}"); + +#endif + + CheckExtensions.IfTrueThrowUserFriendlyException(!result.Success || (result.Code != ACOOLYConstant.Code.SUCCESS && result.Code != ACOOLYConstant.Code.PROCESSING), + "璋冪敤ACOOLY鎺ュ彛ConfirmElectricOrder杩斿洖閿欒:" + JsonConvert.SerializeObject(result)); + + return (result.Code, requestInput.RequestNo, result.ElectricChargeOrder.BusiOrderNo); + } + + public async Task<ModelPaymentMiniPay> PayTransactionsJsAPI(string openid, string order_guid, decimal amount, string outTradeNo, string description) + { + string time_expire = DateTime.Now.AddMinutes(5).ToString("yyyy-MM-ddTHH:mm:ss") + "+08:00";//璁㈠崟澶辨晥鏃堕棿 + ModelMiniPayRequest req = new ModelMiniPayRequest + { + + TimeExpire = time_expire, + Appid = _wxPayOptions.AppID, + Mchid = _wxPayOptions.Mchid, + Attach = order_guid, + Description = description, + OutTradeNo = outTradeNo, + Amount = new Model_MiniPay_Amount + { + Total = Convert.ToInt32(100 * amount), + Currency = "CNY" + }, + NotifyUrl = $"{_wxPayOptions.NotifyUrl}{LifePaymentConstant.WxRechargeNotifySectionUrl}", + Payer = new Model_MiniPay_Payer + { + OpenId = openid + } + }; + var timestamp = DateTimeOffset.Now.ToUnixTimeSeconds(); + string nonce = Guid.NewGuid().ToString(); + + var res = await _wxPayApi.PayTransactionsJsAPI(req); + string package = "prepay_id=" + res.PrepayId; + ModelPaymentMiniPay info = new ModelPaymentMiniPay(); + if (res != null) + { + + string paytext = BuildSignByPay(_wxPayOptions.AppID, timestamp, nonce, package); + string paysign = _wxPayApi.GeneratePaySignByKey(paytext); + + info.Timestamp = timestamp.ToString(); + info.NonceStr = nonce; + info.Package = package; + info.SignType = "RSA"; + info.PaySign = paysign; + info.TimeExpire = time_expire; + } + return info; + } + + /// <summary> + /// 鏋勯�犵鍚嶄覆 + /// </summary> + /// <param name="appId">灏忕▼搴忕殑AppID</param> + /// <param name="timestamp">鏃堕棿鎴�</param> + /// <param name="nonceStr">闅忔満瀛楃涓�</param> + /// <param name="package">package鍊�</param> + /// <returns>绛惧悕涓�</returns> + public string BuildSignByPay(string appId, long timestamp, string nonceStr, string package) + { + string format = $"{appId}\n{timestamp}\n{nonceStr}\n{package}\n"; + return format; + } + + /// <summary> + /// 鏀粯鎴愬姛鍥炶皟澶勭悊 + /// </summary> + /// <param name="orderNo"></param> + /// <param name="outOrderNo"></param> + /// <returns></returns> + public async Task LifePaySuccessHandler(string orderNo, string outOrderNo) + { + var order = await _lifePayOrderRepository.Where(x => x.OrderNo == orderNo).FirstOrDefaultAsync(); + CheckExtensions.IfTrueThrowUserFriendlyException(order == null, "璁㈠崟涓嶅瓨鍦�"); + + if (order.PayStatus == LifePayStatusEnum.宸叉敮浠�) + { + return; + } + + order.PayStatus = LifePayStatusEnum.宸叉敮浠�; + order.PayTime = DateTime.Now; + order.OutOrderNo = outOrderNo; + try + { + var result = (Code: "Fail", RequestNo: "", ACOOLYOrderNo: ""); + switch (order.LifePayOrderType) + { + case LifePayOrderTypeEnum.璇濊垂璁㈠崟: + result = await CreateACOOLYPhoneOrder(JsonConvert.DeserializeObject<LifePhoneData>(order.OrderParamDetailJsonStr), order.OrderNo); + break; + case LifePayOrderTypeEnum.鐢佃垂璁㈠崟: + result = await CreateACOOLYElectricOrder(JsonConvert.DeserializeObject<LifeElectricData>(order.OrderParamDetailJsonStr), order.OrderNo); + break; + default: + break; + } + + order.LifePayOrderStatus = LifePayOrderStatusEnum.寰呯‘璁�; + //SetOrderStatus(order, result.Code); + order.OutRequestNo = result.RequestNo.IsNullOrEmpty() ? null : result.RequestNo; + order.ACOOLYOrderNo = result.ACOOLYOrderNo.IsNullOrEmpty() ? null : result.ACOOLYOrderNo; + } + catch (Exception ex) + { + _logger.LogError(ex, "澶勭悊鐢熸椿缂磋垂鏀粯鎴愬姛鍥炶皟鏃跺紓甯�"); + order.LifePayOrderStatus = LifePayOrderStatusEnum.宸插け璐�; + order.PayStatus = LifePayStatusEnum.寰呴��娆�; + } + _logger.LogError("鐢熸椿缂磋垂璁㈠崟鐘舵�侊細" + order.LifePayOrderStatus.ToString()); + await _lifePayOrderRepository.UpdateAsync(order); + } + + /// <summary> + /// ACOOLYO璁㈠崟閫氱煡澶勭悊 + /// </summary> + /// <param name="orderNo"></param> + /// <param name="outOrderNo"></param> + /// <returns></returns> + public async Task ACOOLYOrderNotifyHandler(string orderNo, string acoolyOrderNo, LifePayOrderStatusEnum status) + { + var order = await _lifePayOrderRepository.Where(x => x.OrderNo == orderNo).FirstOrDefaultAsync(); + CheckExtensions.IfTrueThrowUserFriendlyException(order == null, "璁㈠崟涓嶅瓨鍦�"); + + if (order.LifePayOrderStatus == LifePayOrderStatusEnum.宸插畬鎴�) + { + return; + } + + order.LifePayOrderStatus = status; + if (acoolyOrderNo.IsNotNullOrEmpty()) + { + order.ACOOLYOrderNo = acoolyOrderNo; + } + + if (order.LifePayOrderStatus == LifePayOrderStatusEnum.宸插畬鎴�) + { + order.FinishTime = DateTime.Now; + } + + if (order.LifePayOrderStatus == LifePayOrderStatusEnum.宸插け璐� && order.PayStatus != LifePayStatusEnum.宸查��娆�) + { + order.PayStatus = LifePayStatusEnum.寰呴��娆�; + } + + await _lifePayOrderRepository.UpdateAsync(order); + } + + /// <summary> + /// 閫�娆剧敓娲荤即璐硅鍗� + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + /// <exception cref="UserFriendlyException"></exception> + public async Task RefundLifePayOrder(RefundLifePayOrderInput input) + { + var order = await _lifePayOrderRepository.FirstOrDefaultAsync(x => x.Id == input.Id); + CheckExtensions.IfTrueThrowUserFriendlyException(order == null, "璁㈠崟涓嶅瓨鍦�"); + + if (order.PayStatus == LifePayStatusEnum.宸查��娆�) + { + return; + } + + if (order.LifePayOrderStatus != LifePayOrderStatusEnum.宸插け璐� && order.PayStatus != LifePayStatusEnum.寰呴��娆�) + { + throw new UserFriendlyException("褰撳墠璁㈠崟鐘舵�佹棤娉曢��娆�"); + } + + order.PayStatus = LifePayStatusEnum.宸查��娆�; + order.RefundCredentialsImgUrl = input.RefundCredentialsImgUrl; + order.RefundTime = DateTime.Now; + + await _lifePayOrderRepository.UpdateAsync(order); + + #region 璁板綍鏃ュ織 + + await PublishLifePayOrderHistoryEvent("閫�娆�", "閫�娆�", order.Id); + + #endregion + + } + + #endregion + + #region 绉佹湁 + + private string CreateOrderNo() + { + return "JF" + DateTime.Now.ToString("yyyyMMddHHmmssfff") + GlobalRandom.GetRandomNum(4); + } + + private (decimal PayAmont, decimal DiscountAmount, decimal RechargeAmount) CalculateAmount(decimal amount, decimal rate) + { + var payAmount = decimal.Round(amount * rate, 2, MidpointRounding.AwayFromZero); + CheckExtensions.IfTrueThrowUserFriendlyException(payAmount < 0.01m, "鏀粯閲戦閿欒"); + + return (payAmount, amount - payAmount, amount); + } + + private void SetOrderStatus(LifePayOrder order, string code) + { + switch (code) + { + case ACOOLYConstant.Code.SUCCESS: + order.LifePayOrderStatus = LifePayOrderStatusEnum.宸插畬鎴�; + order.FinishTime = DateTime.Now; + break; + case ACOOLYConstant.Code.PROCESSING: + order.LifePayOrderStatus = LifePayOrderStatusEnum.寰呯‘璁�; + break; + default: + break; + } + } + + /// <summary> + /// 璁板綍鐩稿叧鐨勬搷浣滃巻鍙� + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + private async Task PublishLifePayOrderHistoryEvent(string operateContent, string operateName, Guid relationId, int? tableType = TableType.LifePayOrder) + { + var recordEto = new RecordOperateHistoryEto + { + CreatorName = CurrentUser.Name, + OperateContent = operateContent, + OperateName = operateName, + RelationId = relationId, + TableType = tableType + }; + + await _distributedEventBus.PublishAsync(recordEto, false); + } + + /// <summary> + /// 鑾峰彇鏀粯浜岀淮鐮� + /// </summary> + /// <param name="payType"></param> + /// <param name="outTradeNo"></param> + /// <param name="description"></param> + /// <param name="amount"></param> + /// <returns></returns> + /// <exception cref="UserFriendlyException"></exception> + public async Task<string> GetPayQRCode(LifePayTypeEnum payType, string outTradeNo, string description, decimal amount, string ip, string h5Type) + { + var codeUrl = string.Empty; + switch (payType) + + + + { + case LifePayTypeEnum.AliPay: + codeUrl = await GetAliPayQRCode(outTradeNo, description, amount); + + break; + case LifePayTypeEnum.WxPay: + codeUrl = await GetWxPayQRCode(outTradeNo, description, amount); //native + // codeUrl = await GetWxPayH5Url(outTradeNo, description, amount, ip, h5Type); //h5 + break; + default: + throw new UserFriendlyException(string.Format(CustomeErrorMessage.NotImplementedWhenSometing, "鑾峰彇鏀粯浜岀淮鐮�")); + } + + return codeUrl; + } + + /// <summary> + /// 鑾峰彇寰俊鏀粯浜岀淮鐮� + /// </summary> + /// <param name="outTradeNo"></param> + /// <param name="description"></param> + /// <param name="amount"></param> + /// <returns></returns> + /// <exception cref="UserFriendlyException"></exception> + private async Task<string> GetWxPayQRCode(string outTradeNo, string description, decimal amount) + { + CheckExtensions.IfTrueThrowUserFriendlyException(amount <= 0, + CustomeErrorMessage.SometingMustSometing, + "鑾峰彇鏀粯浜岀淮鐮佹椂閲戦", "澶т簬0"); + + var res = await _wxPayApi.PayTransactionsNative(new PayTransactionsNativeInput + { + Appid = _wxPayOptions.AppID, + Mchid = _wxPayOptions.Mchid, + Description = description, + OutTradeNo = outTradeNo, + Amount = new PayAmount + { + Total = Convert.ToInt32(100 * amount), + }, + NotifyUrl = $"{_wxPayOptions.NotifyUrl}{LifePaymentConstant.WxRechargeNotifySectionUrl}", + }); + + if (res == null || res.CodeUrl.IsNullOrEmpty()) + { + _logger.LogError($"鑾峰彇寰俊鏀粯浜岀淮鐮佸紓甯�:{(res == null ? "杩斿洖鍙傛暟涓虹┖" : $"{res.Code} --{res.Message}")}"); + throw new UserFriendlyException(string.Format(CustomeErrorMessage.SometingError, "鑾峰彇鏀粯浜岀淮鐮佹椂")); + } + + return res.CodeUrl; + } + + /// <summary> + /// 鑾峰彇寰俊鏀粯浜岀淮鐮� + /// </summary> + /// <param name="outTradeNo"></param> + /// <param name="description"></param> + /// <param name="amount"></param> + /// <returns></returns> + /// <exception cref="UserFriendlyException"></exception> + private async Task<string> GetWxPayH5Url(string outTradeNo, string description, decimal amount, string ip, string h5Type) + { + CheckExtensions.IfTrueThrowUserFriendlyException(amount <= 0, + CustomeErrorMessage.SometingMustSometing, + "鑾峰彇鏀粯浜岀淮鐮佹椂閲戦", "澶т簬0"); + + var res = await _wxPayApi.PayTransactionsH5(new PayTransactionsNativeH5 + { + Appid = _wxPayOptions.AppID, + Mchid = _wxPayOptions.Mchid, + Description = description, + OutTradeNo = outTradeNo, + Amount = new PayAmount + { + Total = Convert.ToInt32(100 * amount), + }, + NotifyUrl = $"{_wxPayOptions.NotifyUrl}{LifePaymentConstant.WxRechargeNotifySectionUrl}", + SceneInfo = new H5SceneInfo() { PayerClientIp = ip, H5Info = new H5Info() { Type = h5Type } } + }); + + if (res == null || res.H5Url.IsNullOrEmpty()) + { + _logger.LogError($"鑾峰彇寰俊鏀粯Url寮傚父:{(res == null ? "杩斿洖鍙傛暟涓虹┖" : $"{res.Code} --{res.Message}")}"); + throw new UserFriendlyException(string.Format(CustomeErrorMessage.SometingError, "鑾峰彇鏀粯Url鏃�")); + } + + return res.H5Url; + } + + /// <summary> + /// 鑾峰彇鏀粯瀹濅簩缁寸爜 + /// </summary> + /// <param name="outTradeNo"></param> + /// <param name="description"></param> + /// <param name="amount"></param> + /// <returns></returns> + /// <exception cref="UserFriendlyException"></exception> + private async Task<string> GetAliPayQRCode(string outTradeNo, string description, decimal amount) + { + CheckExtensions.IfTrueThrowUserFriendlyException(amount < 0.01M, + CustomeErrorMessage.SometingMustSometing, + "鑾峰彇鏀粯浜岀淮鐮佹椂閲戦", "澶т簬0.01"); + + var res = await _aliPayApi.GetAliPayQRCode(new GetPayQrCodeInput + { + Subject = description, + OutTradeNo = outTradeNo, + TotalAmount = amount, + }); + + if (res == null || res.QrCode.IsNullOrEmpty()) + { + _logger.LogError($"鑾峰彇鏀粯瀹濇敮浠樹簩缁寸爜寮傚父:{(res == null ? "杩斿洖鍙傛暟涓虹┖" : $"{res.Code} --{res.Msg}")}"); + throw new UserFriendlyException(string.Format(CustomeErrorMessage.SometingError, "鑾峰彇鏀粯浜岀淮鐮佹椂")); + } + + return res.QrCode; + } + /// <summary> + /// 鏋勯�犲緟绛惧悕瀛楃涓� + /// </summary> + /// <param name="method">HTTP璇锋眰鏂规硶</param> + /// <param name="uri">API鎺ュ彛鐨勭浉瀵硅矾寰�</param> + /// <param name="timestamp">鏃堕棿鎴筹紙绉掔骇锛�</param> + /// <param name="nonce">闅忔満瀛楃涓�</param> + /// <param name="body">璇锋眰浣撶殑JSON瀛楃涓�</param> + /// <returns>寰呯鍚嶅瓧绗︿覆</returns> + public static string BuildSignByUniOrder(string method, string uri, long timestamp, string nonce, string body) + { + string message = $"{method}\n{uri}\n{timestamp}\n{nonce}\n{body}\n"; + return message; + } + + + #endregion +} diff --git a/LifePayment/LifePayment.Domain.Shared/ACOOLY/ACOOLYConstant.cs b/LifePayment/LifePayment.Domain.Shared/ACOOLY/ACOOLYConstant.cs new file mode 100644 index 0000000..3c6984d --- /dev/null +++ b/LifePayment/LifePayment.Domain.Shared/ACOOLY/ACOOLYConstant.cs @@ -0,0 +1,69 @@ +锘縰sing Nest; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace LifePayment.Domain.Shared; + +public static class ACOOLYConstant +{ + + /// <summary> + /// 鏈嶅姟鐮� + /// </summary> + public static class Sevice + { + /// <summary> + /// 鑾峰彇鐕冩皵闈㈠�� + /// </summary> + public const string GasParValue = "gasParValue"; + + /// <summary> + /// 鎻愪氦鐕冩皵璁㈠崟 + /// </summary> + public const string ConfirmGasOrder = "confirmGasOrder"; + + /// <summary> + /// 鑾峰彇鐢佃垂闈㈠�� + /// </summary> + public const string ElectricParValue = "electricParValue"; + + /// <summary> + /// 鎻愪氦鐢佃垂璁㈠崟 + /// </summary> + public const string ConfirmElectricOrder = "confirmElectricOrder"; + + /// <summary> + /// 鑾峰彇鐢佃瘽璐归潰鍊� + /// </summary> + public const string PhoneParValue = "phoneParValue"; + + /// <summary> + /// 鎻愪氦鐢佃瘽璐硅鍗� + /// </summary> + public const string ConfirmPhoneOrder = "confirmPhoneOrder"; + + /// <summary> + /// 鐧诲綍 + /// </summary> + public const string Login = "login"; + + /// <summary> + /// 鑾峰彇鍏呭�煎尯鍩� + /// </summary> + public const string ElectricSupportArea = "queryElectricSupportArea"; + + + } + + public static class Code + { + public const string SUCCESS = "SUCCESS"; + + public const string PROCESSING = "PROCESSING"; + } + + public const string NotifyUrl = "/api/ACOOLYNotify/ACOOLYNotify"; +} diff --git a/LifePayment/LifePayment.Domain.Shared/ACOOLY/ACOOLYInput.cs b/LifePayment/LifePayment.Domain.Shared/ACOOLY/ACOOLYInput.cs new file mode 100644 index 0000000..a55ccd9 --- /dev/null +++ b/LifePayment/LifePayment.Domain.Shared/ACOOLY/ACOOLYInput.cs @@ -0,0 +1,275 @@ +锘縰sing Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace LifePayment.Domain.Shared; + +/// <summary> +/// 鍏叡璇锋眰鍙傛暟鍩虹被 +/// </summary> +public class ACOOLYRequestBaseInput +{ + /// <summary> + /// 璇锋眰鍙凤紙16-40浣嶏級鏃犻渶浼犲叆锛岀郴缁熻嚜鍔ㄧ敓鎴� + /// </summary> + [JsonProperty("requestNo")] + public string RequestNo { get; set; } + + /// <summary> + /// 鍟嗘埛ID锛堝畾闀�20瀛楃锛夋棤闇�浼犲叆锛岃鍙栭厤缃� + /// </summary> + [JsonProperty("partnerId")] + public string PartnerId { get; set; } + + /// <summary> + /// 鏈嶅姟鍚嶇О锛堟渶澶�32瀛楃锛� 鏃犻渶浼犲叆 + /// </summary> + [JsonProperty("service")] + public string Service { get; set; } + + /// <summary> + /// 鏈嶅姟鐗堟湰锛堟渶澶�8瀛楃锛夋棤闇�浼犲叆 + /// </summary> + [JsonProperty("version")] + public string Version { get; set; } = "1.0"; + + /// <summary> + /// 鍗忚绫诲瀷锛堥粯璁TTP/JSON锛夋棤闇�浼犲叆 + /// </summary> + [JsonProperty("protocol")] + public string Protocol { get; set; } = "HTTP/JSON"; + + /// <summary> + /// 浼氳瘽鍙傛暟锛圝SON鏍煎紡锛� + /// </summary> + [StringLength(128, ErrorMessage = "浼氳瘽鍙傛暟鏈�澶�128瀛楃")] + [JsonProperty("context")] + public string Context { get; set; } + + /// <summary> + /// 鎵╁睍鍙傛暟锛圝SON鍗曞眰缁撴瀯锛� + /// </summary> + [StringLength(1024, ErrorMessage = "鎵╁睍鍙傛暟鏈�澶�1024瀛楃")] + [JsonProperty("ext")] + public string Ext { get; set; } + + /// <summary> + /// 椤甸潰璺宠浆鍦板潃 + /// </summary> + [StringLength(128, ErrorMessage = "璺宠浆鍦板潃鏈�澶�128瀛楃")] + [Url(ErrorMessage = "闈炴硶鐨刄RL鏍煎紡")] + [JsonProperty("returnUrl")] + public string ReturnUrl { get; set; } + + /// <summary> + /// 寮傛閫氱煡鍦板潃 + /// </summary> + [StringLength(128, ErrorMessage = "閫氱煡鍦板潃鏈�澶�128瀛楃")] + [Url(ErrorMessage = "闈炴硶鐨刄RL鏍煎紡")] + [JsonProperty("notifyUrl")] + public string NotifyUrl { get; set; } +} + +/// <summary> +/// 鑾峰彇鐕冩皵闈㈠�艰姹傚弬鏁� +/// </summary> +public class GasParValueRequestInput : ACOOLYRequestBaseInput +{ + /// <summary> + /// 澶╃劧姘斿叕鍙哥被鍨� + /// </summary> + [JsonProperty("gasOrgType")] + public string GasOrgType { get; set; } + +} + +/// <summary> +/// 鎻愪氦鐕冩皵璁㈠崟璇锋眰鍙傛暟 +/// </summary> +public class ConfirmGasOrderRequestInput : ACOOLYRequestBaseInput +{ + /// <summary> + /// 澶栭儴鍟嗘埛璁㈠崟鍙� + /// </summary> + [Required(ErrorMessage = "澶栭儴鍟嗘埛璁㈠崟鍙蜂笉鑳戒负绌�")] + [JsonProperty("outOrderNo")] + public string OutOrderNo { get; set; } + + /// <summary> + /// 鍏呭�奸潰棰� + /// </summary> + [Required(ErrorMessage = "鍏呭�奸潰棰濅笉鑳戒负绌�")] + [Range(0.01, double.MaxValue, ErrorMessage = "鍏呭�奸潰棰濆繀椤诲ぇ浜�0")] + [JsonProperty("parValue")] + public decimal ParValue { get; set; } + + /// <summary> + /// 澶╃劧姘斿叕鍙哥被鍨� + /// </summary> + [Required(ErrorMessage = "澶╃劧姘斿叕鍙哥被鍨嬩笉鑳戒负绌�")] + [JsonProperty("gasOrgType")] + public string GasOrgType { get; set; } + + /// <summary> + /// 澶╃劧姘斿彿 + /// </summary> + [Required(ErrorMessage = "澶╃劧姘斿彿涓嶈兘涓虹┖")] + [JsonProperty("gasAccount")] + public string GasAccount { get; set; } + + /// <summary> + /// 鍦板尯 + /// </summary> + [JsonProperty("areaName")] + public string AreaName { get; set; } +} + +/// <summary> +/// 鎻愪氦鐢佃垂璁㈠崟璇锋眰鍙傛暟 +/// </summary> +public class ConfirmElectricOrderRequestInput : ACOOLYRequestBaseInput +{ + /// <summary> + /// 鍏呭�奸潰棰濓紝鍗曚綅涓哄厓銆� + /// </summary> + [Required(ErrorMessage = "鍏呭�奸潰棰濇槸蹇呭~椤广��")] + [JsonProperty("parValue")] + public decimal ParValue { get; set; } + + /// <summary> + /// 鐢电綉绫诲瀷锛屼緥濡傦細"guowang"浠h〃鍥藉鐢电綉锛�"nanwang"浠h〃鍗楁柟鐢电綉銆� + /// </summary> + [Required(ErrorMessage = "鐢电綉绫诲瀷鏄繀濉」銆�")] + [JsonProperty("electricType")] + public string ElectricType { get; set; } + + /// <summary> + /// 鐢佃垂绫诲瀷锛屽浗缃戝繀浼狅細浣忓畢銆佷紒浜嬩笟銆佸簵閾轰笁涓�夐」銆� + /// </summary> + [Required(ErrorMessage = "鐢佃垂绫诲瀷鏄繀濉」銆�")] + [StringLength(20, ErrorMessage = "鐢佃垂绫诲瀷闀垮害涓嶈兘瓒呰繃20涓瓧绗︺��")] + [JsonProperty("electricAccountType")] + public string ElectricAccountType { get; set; } + + /// <summary> + /// 鐢佃垂鎴峰彿銆� + /// </summary> + [Required(ErrorMessage = "鐢佃垂鎴峰彿鏄繀濉」銆�")] + [StringLength(50, ErrorMessage = "鐢佃垂鎴峰彿闀垮害涓嶈兘瓒呰繃50涓瓧绗︺��")] + [JsonProperty("electricAccount")] + public string ElectricAccount { get; set; } + + /// <summary> + /// 鐪佷唤銆� + /// </summary> + [Required(ErrorMessage = "鐪佷唤鏄繀濉」銆�")] + [StringLength(20, ErrorMessage = "鐪佷唤闀垮害涓嶈兘瓒呰繃20涓瓧绗︺��")] + [JsonProperty("province")] + public string Province { get; set; } + + /// <summary> + /// 鍩庡競銆� + /// </summary> + [Required(ErrorMessage = "鍩庡競鏄繀濉」銆�")] + [StringLength(20, ErrorMessage = "鍩庡競闀垮害涓嶈兘瓒呰繃20涓瓧绗︺��")] + [JsonProperty("city")] + public string City { get; set; } + + /// <summary> + /// 瀹㈡埛韬唤璇佸悗6浣嶏紝鍗楃綉蹇呬紶銆� + /// </summary> + [JsonProperty("sixID")] + public string SixID { get; set; } + + /// <summary> + /// 璁㈠崟鍙� + /// </summary> + [JsonProperty("outOrderNo")] + public string OutOrderNo { get; set; } +} + +/// <summary> +/// 鎻愪氦鐢佃瘽璐硅鍗曡姹傚弬鏁� +/// </summary> +public class ConfirmPhoneOrderRequestInput : ACOOLYRequestBaseInput +{ + /// <summary> + /// 杩愯惀鍟嗙紪鐮侊紝渚嬪锛�"yidong", "dianxin", "liantong"銆� + /// </summary> + [Required(ErrorMessage = "杩愯惀鍟嗙紪鐮佹槸蹇呭~椤广��")] + [JsonProperty("ispCode")] + public string IspCode { get; set; } + + /// <summary> + /// 鍏呭�奸潰棰濓紝鍗曚綅涓哄厓銆傛祴璇曡处鎴凤細parValue=100:缂磋垂鎴愬姛锛宲arValue>100锛氱即璐瑰け璐ャ�� + /// </summary> + [Required(ErrorMessage = "鍏呭�奸潰棰濇槸蹇呭~椤广��")] + [JsonProperty("parValue")] + public decimal ParValue { get; set; } + + /// <summary> + /// 鎵嬫満鍙枫�� + /// </summary> + [Required(ErrorMessage = "鎵嬫満鍙锋槸蹇呭~椤广��")] + [JsonProperty("phone")] + public string Phone { get; set; } + + /// <summary> + /// 澶栭儴璁㈠崟鍙� + /// </summary> + [Required(ErrorMessage = "璁㈠崟鍙锋槸蹇呭~椤广��")] + [JsonProperty("outOrderNo")] + public string OutOrderNo { get; set; } + + /// <summary> + /// 鏈轰富鍚嶇О(鐢典俊鎵嬫満鍙峰繀濉�) + /// </summary> + [JsonProperty("name")] + public string Name { get; set; } +} + +public class SetLifePayOrderPayTypeInput +{ + [Required(ErrorMessage = "璁㈠崟鍙蜂笉鍙负绌�")] + public string OrderNo { get; set; } + + [EnumValidation(typeof(LifePayTypeEnum), ErrorMessage = "鏀粯鏂瑰紡寮傚父")] + public LifePayTypeEnum LifePayType { get; set; } + + public string H5Type { get; set; } + + /// <summary> + /// 鏀粯OpenId + /// </summary> + public string OpenId { get; set; } + + /// <summary> + /// 鍟嗘埛鏁版嵁鍖� + /// </summary> + public string Attach { get; set; } + +} + +public class GetPayOrderForJsAPIInput +{ + [Required(ErrorMessage = "璁㈠崟鍙蜂笉鍙负绌�")] + public string OrderNo { get; set; } + + [EnumValidation(typeof(LifePayTypeEnum), ErrorMessage = "鏀粯鏂瑰紡寮傚父")] + public LifePayTypeEnum LifePayType { get; set; } + + /// <summary> + /// 鏀粯OpenId + /// </summary> + public string OpenId { get; set; } + + /// <summary> + /// 鍟嗘埛鏁版嵁鍖� + /// </summary> + public string Attach { get; set; } + +} \ No newline at end of file diff --git a/LifePayment/LifePayment.Domain.Shared/ACOOLY/ACOOLYOption.cs b/LifePayment/LifePayment.Domain.Shared/ACOOLY/ACOOLYOption.cs new file mode 100644 index 0000000..be26f3c --- /dev/null +++ b/LifePayment/LifePayment.Domain.Shared/ACOOLY/ACOOLYOption.cs @@ -0,0 +1,20 @@ +锘縰sing System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace LifePayment.Domain.Shared; + +public class ACOOLYOption +{ + public string PartnerId { get; set; } + + public string SecrtKey { get; set; } + + public string ServerHost { get; set; } + + public string Accesskey { get; set; } + + public string NotifyUrl { get; set; } +} diff --git a/LifePayment/LifePayment.Domain.Shared/ACOOLY/ACOOLYOutput.cs b/LifePayment/LifePayment.Domain.Shared/ACOOLY/ACOOLYOutput.cs new file mode 100644 index 0000000..c8c348d --- /dev/null +++ b/LifePayment/LifePayment.Domain.Shared/ACOOLY/ACOOLYOutput.cs @@ -0,0 +1,524 @@ +锘縰sing Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace LifePayment.Domain.Shared; + +public interface IACOOLYRequestBaseResponse +{ + /// <summary> + /// 鎺ュ彛璋冪敤鐘舵�侊紙true/false锛� + /// </summary> + public bool Success { get; set; } + + /// <summary> + /// 璇锋眰鍙凤紙16-40浣嶏級 + /// </summary> + public string RequestNo { get; set; } + + /// <summary> + /// 鍟嗘埛ID锛堝畾闀�20瀛楃锛� + /// </summary> + public string PartnerId { get; set; } + + /// <summary> + /// 鏈嶅姟鍚嶇О + /// </summary> + public string Service { get; set; } + + /// <summary> + /// 鏈嶅姟鐗堟湰锛堥粯璁�1.0锛� + /// </summary> + public string? Version { get; set; } + + /// <summary> + /// 鍗忚绫诲瀷锛圚TTP/JSON锛� + /// </summary> + public string? Protocol { get; set; } + + /// <summary> + /// 浼氳瘽鍙傛暟锛圝SON鏍煎紡锛� + /// </summary> + public string? Context { get; set; } + + /// <summary> + /// 鎵╁睍鍙傛暟锛圝SON鍗曞眰缁撴瀯锛� + /// </summary> + public object Ext { get; set; } + + /// <summary> + /// 鍝嶅簲缂栫爜锛圫UCCESS/PARAM_ERROR绛夛級 + /// </summary> + public string Code { get; set; } + + /// <summary> + /// 鍝嶅簲娑堟伅 + /// </summary> + public string Message { get; set; } + + /// <summary> + /// 鍝嶅簲璇︽儏 + /// </summary> + public string? Detail { get; set; } +} + +/// <summary> +/// 鍏叡鍝嶅簲鍙傛暟鍩虹被 +/// </summary> +public class ACOOLYRequestBaseResponse : IACOOLYRequestBaseResponse +{ + /// <summary> + /// 鎺ュ彛璋冪敤鐘舵�侊紙true/false锛� + /// </summary> + public bool Success { get; set; } + + /// <summary> + /// 璇锋眰鍙凤紙16-40浣嶏級 + /// </summary> + public string RequestNo { get; set; } + + /// <summary> + /// 鍟嗘埛ID锛堝畾闀�20瀛楃锛� + /// </summary> + public string PartnerId { get; set; } + + /// <summary> + /// 鏈嶅姟鍚嶇О + /// </summary> + public string Service { get; set; } + + /// <summary> + /// 鏈嶅姟鐗堟湰锛堥粯璁�1.0锛� + /// </summary> + public string? Version { get; set; } + + /// <summary> + /// 鍗忚绫诲瀷锛圚TTP/JSON锛� + /// </summary> + public string? Protocol { get; set; } + + /// <summary> + /// 浼氳瘽鍙傛暟锛圝SON鏍煎紡锛� + /// </summary> + public string? Context { get; set; } + + /// <summary> + /// 鎵╁睍鍙傛暟锛圝SON鍗曞眰缁撴瀯锛� + /// </summary> + public object Ext { get; set; } + + /// <summary> + /// 鍝嶅簲缂栫爜锛圫UCCESS/PARAM_ERROR绛夛級 + /// </summary> + public string Code { get; set; } + + /// <summary> + /// 鍝嶅簲娑堟伅 + /// </summary> + public string Message { get; set; } + + /// <summary> + /// 鍝嶅簲璇︽儏 + /// </summary> + public string? Detail { get; set; } +} + +/// <summary> +/// 鑾峰彇鐕冩皵闈㈠�艰繑鍥炲弬鏁� +/// </summary> +public class GasParValueResponse : ACOOLYRequestBaseResponse +{ + /// <summary> + /// 澶╃劧姘斿叕鍙哥被鍨� + /// </summary> + [JsonProperty("gasParValue")] + public GasParValueOutput GasParValue { get; set; } + +} + +/// <summary> +/// 鐕冩皵闈㈠�兼暟鎹� +/// </summary> +public class GasParValueOutput +{ + /// <summary> + /// 澶╃劧姘斿悕绉帮紙绀轰緥锛氫腑鍥界噧姘斿ぉ锛� + /// </summary> + [JsonProperty("gasOrgName")] + public string GasOrgName { get; set; } + + /// <summary> + /// 澶╃劧姘斿崟浣嶇紪鐮侊紙绀轰緥锛歾hong_guo锛� + /// </summary> + [JsonProperty("gasOrgCode")] + public string GasOrgCode { get; set; } + + /// <summary> + /// 闈㈤鏁扮粍锛堢ず渚嬶細100,200,300锛� + /// </summary> + [JsonProperty("parValue")] + public List<string> ParValue { get; set; } + + /// <summary> + /// 鎶樻墸鐜囷紙绀轰緥锛�0.94锛� + /// </summary> + [JsonProperty("rate")] + public decimal Rate { get; set; } + + /// <summary> + /// 澶囨敞淇℃伅锛堢ず渚嬶細杞綉鐢ㄦ埛涓嶈兘鍏呭�硷級 + /// </summary> + [JsonProperty("comments")] + public string Comments { get; set; } +} + +/// <summary> +/// 鎻愪氦鐕冩皵璁㈠崟杩斿洖鍙傛暟 +/// </summary> +public class ConfirmGasOrderResponse : ACOOLYRequestBaseResponse +{ + [JsonProperty("gasChargeOrder")] + public GasChargeOrderOutput GasChargeOrder { get; set; } + +} + +public class GasChargeOrderOutput +{ + /// <summary> + /// 鍟嗘埛璁㈠崟鍙枫�� + /// </summary> + [JsonProperty("outOrderNo")] + public string OutOrderNo { get; set; } + + /// <summary> + /// 骞冲彴璁㈠崟鍙枫�� + /// </summary> + [JsonProperty("busiOrderNo")] + public string BusiOrderNo { get; set; } + + /// <summary> + /// 澶╃劧姘斿叕鍙哥被鍨嬶紝渚嬪锛�"xin_ao"浠h〃鏂板ゥ鐕冩皵銆� + /// </summary> + [JsonProperty("gasOrgType")] + public string GasOrgType { get; set; } + + /// <summary> + /// 鍖哄煙鍚嶇О锛屽锛氬寳浜紝涓婃捣锛屽箍涓滐紝婀栧寳绛夈�� + /// </summary> + [JsonProperty("areaName")] + public string AreaName { get; set; } + + /// <summary> + /// 鐢佃垂闈㈠�奸噾棰濓紝鍗曚綅涓哄厓銆� + /// </summary> + [JsonProperty("parValue")] + public decimal ParValue { get; set; } + + /// <summary> + /// 瀹為檯鎵f閲戦锛屽崟浣嶄负鍏冦�� + /// </summary> + [JsonProperty("payAmount")] + public decimal PayAmount { get; set; } + + /// <summary> + /// 澶╃劧姘旇处鍙枫�� + /// </summary> + [JsonProperty("gasAccount")] + public string GasAccount { get; set; } + + /// <summary> + /// 鍏呭�肩姸鎬侊紝濡傦細"SUCCESS"琛ㄧず鍏呭�兼垚鍔熴�� + /// </summary> + [JsonProperty("status")] + public string Status { get; set; } + + /// <summary> + /// 鐘舵�佹弿杩帮紝濡傦細"鍏呭�兼垚鍔�"銆� + /// </summary> + [JsonProperty("statusText")] + public string StatusText { get; set; } +} + +/// <summary> +/// 鐢佃垂闈㈠�艰繑鍥炲弬鏁� +/// </summary> +public class ElectricParValueResponse : ACOOLYRequestBaseResponse +{ + [JsonProperty("electricParValue")] + public List<ElectricParValueOutput> ElectricParValue { get; set; } +} + +/// <summary> +/// 鐢佃垂鍏呭�间俊鎭被锛岀敤浜庤〃绀虹數璐瑰厖鍊肩浉鍏崇殑璇︾粏淇℃伅銆� +/// </summary> +public class ElectricParValueOutput +{ + /// <summary> + /// 鐢电綉绫诲瀷锛屼緥濡傦細"guowang"浠h〃鍥藉鐢电綉锛�"nanwang"浠h〃鍗楁柟鐢电綉銆� + /// </summary> + [JsonProperty("electricType")] + public string ElectricType { get; set; } + + /// <summary> + /// 鍖哄煙鍚嶇О锛屽锛氬寳浜紝涓婃捣锛屽箍涓滐紝婀栧寳绛夈�� + /// </summary> + [JsonProperty("areaName")] + public string AreaName { get; set; } + + /// <summary> + /// 闈㈤锛屽崟浣嶄负鍏冦�傚彲鑳界殑鍊煎寘鎷�100,200,300绛夈�� + /// </summary> + [JsonProperty("parValue")] + public List<string> ParValue { get; set; } // 鍋囪闈㈤涓烘暣鏁� + + /// <summary> + /// 鎶樻墸鐜囷紝鍙�夐」銆傛姌鎵g巼涓轰竴涓诞鐐规暟锛屼緥濡�0.94浠h〃94%銆� + /// </summary> + [JsonProperty("rate")] + public decimal? Rate { get; set; } // 浣跨敤鍙┖绫诲瀷琛ㄧず鍙�夊瓧娈� + + /// <summary> + /// 澶囨敞锛屽彲閫夐」銆備緥濡傦細"杞綉鐢ㄦ埛涓嶈兘鍏呭��"銆� + /// </summary> + [JsonProperty("comments")] + public string Comments { get; set; } // 澶囨敞瀛楁榛樿鍙互涓虹┖瀛楃涓叉垨null锛岃〃绀哄彲閫� +} + + +public class ElectricSupportAreaResponse : ACOOLYRequestBaseResponse +{ + [JsonProperty("electricSupportAreaList")] + public List<ElectricSupportAreaListOutput> ElectricAreaList { get; set; } +} + +public class ElectricSupportAreaListOutput +{ + /// <summary> + /// 鍩庡競鑷繁鍒楄〃銆� + /// </summary> + [JsonProperty("childCityList")] + public List<ElectricSupportAreaChildCityListOutput> ChildCityList { get; set; } + + /// <summary> + /// 鍩庡競鍚嶇О銆� + /// </summary> + [JsonProperty("cityName")] + public string CityName { get; set; } + + /// <summary> + /// 鍩庡競鐖剁骇Id銆� + /// </summary> + [JsonProperty("cityParentId")] + public string CityParentId { get; set; } // 鍋囪闈㈤涓烘暣鏁� + + /// <summary> + /// 鍩庡競Id銆� + /// </summary> + [JsonProperty("cityId")] + public string CityId { get; set; } // 浣跨敤鍙┖绫诲瀷琛ㄧず鍙�夊瓧娈� + + /// <summary> + /// 鐢电綉绫诲瀷锛屼緥濡傦細"guowang"浠h〃鍥藉鐢电綉锛�"nanwang"浠h〃鍗楁柟鐢电綉銆� + /// </summary> + [JsonProperty("electricType")] + public string ElectricType { get; set; } + + /// <summary> + /// 闈㈤锛屽崟浣嶄负鍏冦�傚彲鑳界殑鍊煎寘鎷�100,200,300绛夈�� + /// </summary> + [JsonProperty("parValue")] + public List<string> ParValue { get; set; } // 鍋囪闈㈤涓烘暣鏁� + + /// <summary> + /// 鎶樻墸鐜囷紝鍙�夐」銆傛姌鎵g巼涓轰竴涓诞鐐规暟锛屼緥濡�0.94浠h〃94%銆� + /// </summary> + [JsonProperty("rate")] + public decimal? Rate { get; set; } // 浣跨敤鍙┖绫诲瀷琛ㄧず鍙�夊瓧娈� +} + +public class ElectricSupportAreaChildCityListOutput +{ + /// <summary> + /// 鍩庡競鍚嶇О銆� + /// </summary> + [JsonProperty("cityName")] + public string CityName { get; set; } + + /// <summary> + /// 鍩庡競鐖剁骇Id銆� + /// </summary> + [JsonProperty("cityParentId")] + public string CityParentId { get; set; } // 鍋囪闈㈤涓烘暣鏁� + + /// <summary> + /// 鍩庡競Id銆� + /// </summary> + [JsonProperty("cityId")] + public string CityId { get; set; } // 浣跨敤鍙┖绫诲瀷琛ㄧず鍙�夊瓧娈� +} + +/// <summary> +/// 璇濊垂闈㈠�艰繑鍥炲弬鏁� +/// </summary> +public class PhoneParValueResponse : ACOOLYRequestBaseResponse +{ + [JsonProperty("phoneParValue")] + public List<PhoneParValueOutput> PhoneParValue { get; set; } +} + +public class PhoneParValueOutput +{ + /// <summary> + /// 杩愯惀鍟嗙紪鐮侊紝渚嬪锛�"yidong", "dianxin", "liantong"銆� + /// </summary> + [JsonProperty("ispCode")] + public string IspCode { get; set; } + + /// <summary> + /// 杩愯惀鍟嗗悕绉帮紝濡傦細绉诲姩锛岃仈閫氾紝鐢典俊銆� + /// </summary> + [JsonProperty("ispName")] + public string IspName { get; set; } + + /// <summary> + /// 闈㈤锛屽崟浣嶄负鍏冦�傚彲鑳界殑鍊煎寘鎷�100, 200, 300绛夈�� + /// </summary> + [JsonProperty("parValue")] + public List<string> ParValue { get; set; } // 鍋囪闈㈤涓烘暣鏁� + + /// <summary> + /// 鎶樻墸鐜囷紝鍙�夐」銆傛姌鎵g巼涓轰竴涓诞鐐规暟锛屼緥濡�0.94浠h〃94%銆� + /// </summary> + [JsonProperty("rate")] + public decimal? Rate { get; set; } // 浣跨敤鍙┖绫诲瀷琛ㄧず鍙�夊瓧娈� + + /// <summary> + /// 鎵嬫満鍙锋锛屼緥濡傦細绉诲姩鐨�134锛�136绛夛紝浣跨敤閫楀彿鍒嗛殧銆� + /// </summary> + [JsonProperty("phoneSection")] + public string PhoneSection { get; set; } + + /// <summary> + /// 澶囨敞锛屽彲閫夐」銆備緥濡傦細"杞綉鐢ㄦ埛涓嶈兘鍏呭��"銆� + /// </summary> + [JsonProperty("comments")] + public string Comments { get; set; } // 澶囨敞瀛楁榛樿鍙互涓虹┖瀛楃涓叉垨null锛岃〃绀哄彲閫� +} + +/// <summary> +/// 鎻愪氦鐢佃垂璁㈠崟杩斿洖鍙傛暟 +/// </summary> +public class ConfirmElectricOrderResponse : ACOOLYRequestBaseResponse +{ + [JsonProperty("electricChargeOrder")] + public ElectricChargeOrderOutput ElectricChargeOrder { get; set; } +} +public class ElectricChargeOrderOutput +{ + /// <summary> + /// 鍟嗘埛璁㈠崟鍙枫�� + /// </summary> + [JsonProperty("outOrderNo")] + public string OutOrderNo { get; set; } + + /// <summary> + /// 骞冲彴璁㈠崟鍙枫�� + /// </summary> + [JsonProperty("busiOrderNo")] + public string BusiOrderNo { get; set; } + + /// <summary> + /// 鐢佃垂鎴峰彿銆� + /// </summary> + [JsonProperty("electricAccount")] + public string ElectricAccount { get; set; } + + /// <summary> + /// 鍖哄煙鍚嶇О锛屽锛氬寳浜紝涓婃捣锛屽箍涓滐紝婀栧寳绛夈�� + /// </summary> + [JsonProperty("areaName")] + public string AreaName { get; set; } + + /// <summary> + /// 鐢电綉绫诲瀷锛屼緥濡傦細"guowang"浠h〃鍥藉鐢电綉锛�"nanwang"浠h〃鍗楁柟鐢电綉銆� + /// </summary> + [JsonProperty("electricType")] + public string ElectricType { get; set; } + + /// <summary> + /// 鐢佃垂闈㈠�奸噾棰濓紝鍗曚綅涓哄厓銆� + /// </summary> + [JsonProperty("parValue")] + public decimal ParValue { get; set; } + + /// <summary> + /// 瀹為檯鎵f閲戦锛屽崟浣嶄负鍏冦�� + /// </summary> + [JsonProperty("payAmount")] + public decimal PayAmount { get; set; } + + /// <summary> + /// 鍏呭�肩姸鎬侊紝濡傦細"SUCCESS"琛ㄧず鍏呭�兼垚鍔熴�� + /// </summary> + [JsonProperty("status")] + public string Status { get; set; } + + /// <summary> + /// 鐘舵�佹弿杩帮紝濡傦細"鍏呭�兼垚鍔�"銆� + /// </summary> + [JsonProperty("statusText")] + public string StatusText { get; set; } + +} + +/// <summary> +/// 鎻愪氦鐢佃瘽璐硅鍗曡繑鍥炲弬鏁� +/// </summary> +public class ConfirmPhoneOrderResponse : ACOOLYRequestBaseResponse +{ + [JsonProperty("phoneChargeOrder")] + public PhoneChargeOrderOutput PhoneChargeOrder { get; set; } +} + +public class PhoneChargeOrderOutput +{ + /// <summary> + /// 澶栭儴鍟嗘埛璁㈠崟鍙枫�� + /// </summary> + [JsonProperty("outOrderNo")] + public string OutOrderNo { get; set; } + + /// <summary> + /// 骞冲彴璁㈠崟鍙枫�� + /// </summary> + [JsonProperty("busiOrderNo")] + public string BusiOrderNo { get; set; } + + /// <summary> + /// 闈㈠�奸噾棰濓紝鍗曚綅涓哄厓銆� + /// </summary> + [JsonProperty("parValue")] + public decimal ParValue { get; set; } + + /// <summary> + /// 瀹為檯鎵f閲戦锛屽崟浣嶄负鍏冦�� + /// </summary> + [JsonProperty("payAmount")] + public decimal PayAmount { get; set; } + + /// <summary> + /// 鍏呭�肩姸鎬侊紝濡傦細"SUCCESS"琛ㄧず鍏呭�兼垚鍔熴�� + /// </summary> + [JsonProperty("status")] + public string Status { get; set; } + + /// <summary> + /// 鐘舵�佹弿杩帮紝濡傦細"鍏呭�兼垚鍔�"銆� + /// </summary> + [JsonProperty("statusText")] + public string StatusText { get; set; } +} \ No newline at end of file diff --git a/LifePayment/LifePayment.Domain.Shared/Ali/AliPaySignAuthenticationDefaults.cs b/LifePayment/LifePayment.Domain.Shared/Ali/AliPaySignAuthenticationDefaults.cs new file mode 100644 index 0000000..bcbe974 --- /dev/null +++ b/LifePayment/LifePayment.Domain.Shared/Ali/AliPaySignAuthenticationDefaults.cs @@ -0,0 +1,13 @@ +锘縰sing System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace LifePayment.Domain.Shared +{ + public class AliPaySignAuthenticationDefaults + { + public const string AuthenticationScheme = "AliPaySignScheme"; + } +} \ No newline at end of file diff --git a/LifePayment/LifePayment.Domain.Shared/Ali/AliRechargeNotifyInput.cs b/LifePayment/LifePayment.Domain.Shared/Ali/AliRechargeNotifyInput.cs new file mode 100644 index 0000000..a8fc7ed --- /dev/null +++ b/LifePayment/LifePayment.Domain.Shared/Ali/AliRechargeNotifyInput.cs @@ -0,0 +1,210 @@ +锘縰sing Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace LifePayment.Domain.Shared +{ + [Serializable] + public class AliRechargeNotifyInput : AliNotifyBaseInput + { + /// <summary> + /// 鏀粯瀹濅氦鏄撳彿锛屾敮浠樺疂浜ゆ槗鍑瘉鍙� + /// </summary> + [JsonProperty("trade_no")] + [Required] + public string TradeNo { set; get; } + + /// <summary> + /// 鏀粯瀹濆簲鐢ㄧ殑APPID + /// </summary> + [JsonProperty("app_id")] + [Required] + public string AppId { set; get; } + + /// <summary> + /// 鍟嗗璁㈠崟鍙� + /// </summary> + [JsonProperty("out_trade_no")] + [Required] + public string OutTradeNo { set; get; } + + /// <summary> + /// 鍟嗗涓氬姟鍙� + /// </summary> + [JsonProperty("out_biz_no")] + public string OutBizNo { set; get; } + + /// <summary> + /// 涔板鏀粯瀹濊处鍙� ID + /// </summary> + [JsonProperty("buyer_id")] + public string BuyerId { set; get; } + + /// <summary> + /// 鍗栧鏀粯瀹濊处鍙� ID + /// </summary> + [JsonProperty("seller_id")] + public string SellerId { set; get; } + + /// <summary> + /// 浜ゆ槗鐘舵�� + /// </summary> + [JsonProperty("trade_status")] + public string TradeStatus { set; get; } + + /// <summary> + /// 璁㈠崟閲戦 + /// </summary> + [JsonProperty("total_amount")] + public decimal? TotalAmount { set; get; } + + /// <summary> + /// 瀹炴敹閲戦 + /// </summary> + [JsonProperty("receipt_amount")] + public decimal? ReceiptAmount { set; get; } + + /// <summary> + /// 寮�绁ㄩ噾棰� + /// </summary> + [JsonProperty("invoice_amount")] + public decimal? InvoiceAmount { set; get; } + + /// <summary> + /// 鐢ㄦ埛鍦ㄤ氦鏄撲腑鏀粯鐨勯噾棰濓紝鍗曚綅涓轰汉姘戝竵锛堝厓锛夛紝绮剧‘鍒板皬鏁扮偣鍚� 2 浣� + /// </summary> + [JsonProperty("buyer_pay_amount")] + public decimal? BuyerPayAmount { set; get; } + + /// <summary> + /// 浣跨敤闆嗗垎瀹濇敮浠橀噾棰濓紝鍗曚綅涓轰汉姘戝竵锛堝厓锛夛紝绮剧‘鍒板皬鏁扮偣鍚� 2 浣� + /// </summary> + [JsonProperty("point_amount")] + public decimal? PointAmount { set; get; } + + /// <summary> + /// 鎬婚��娆鹃噾棰� + /// </summary> + [JsonProperty("refund_fee")] + public decimal? RefundFee { set; get; } + + /// <summary> + /// 璁㈠崟鏍囬/鍟嗗搧鏍囬/浜ゆ槗鏍囬/璁㈠崟鍏抽敭瀛楃瓑锛屾槸璇锋眰鏃跺搴斿弬鏁帮紝浼氬湪閫氱煡涓師鏍蜂紶鍥� + /// </summary> + [JsonProperty("subject")] + public string Subject { set; get; } + + /// <summary> + /// 鍟嗗搧鎻忚堪 + /// </summary> + [JsonProperty("body")] + public string Body { set; get; } + + /// <summary> + /// 浜ゆ槗鍒涘缓鏃堕棿 + /// </summary> + [JsonProperty("gmt_create")] + public DateTime? GmtCreate { get; set; } + + /// <summary> + /// 浜ゆ槗浠樻鏃堕棿 + /// </summary> + [JsonProperty("gmt_payment")] + public DateTime? GmtPayment { get; set; } + + /// <summary> + /// 浜ゆ槗閫�娆炬椂闂� + /// </summary> + [JsonProperty("gmt_refund")] + public DateTime? GmtRefund { get; set; } + + /// <summary> + /// 浜ゆ槗缁撴潫鏃堕棿 + /// </summary> + [JsonProperty("gmt_close")] + public DateTime? GmtClose { get; set; } + + /// <summary> + /// 鏀粯閲戦淇℃伅銆傛敮浠樻垚鍔熺殑鍚勪釜娓犻亾閲戦淇℃伅 + /// </summary> + [JsonProperty("fund_bill_list")] + public string FundBillList { set; get; } + + /// <summary> + /// 浼樻儬鍒镐俊鎭�傛湰浜ゆ槗鏀粯鏃舵墍浣跨敤鐨勬墍鏈変紭鎯犲埜淇℃伅銆� + /// </summary> + [JsonProperty("vocher_detail_list")] + public string VocherDetailList { set; get; } + + /// <summary> + /// 鍥炰紶鍙傛暟锛屽叕鍏卞洖浼犲弬鏁帮紝濡傛灉璇锋眰鏃朵紶閫掍簡璇ュ弬鏁帮紝鍒欒繑鍥炵殑寮傛閫氱煡浼氬師鏍蜂紶鍥炪�� + /// </summary> + [JsonProperty("passback_params")] + + public string PassbackParams { set; get; } + } + + [Serializable] + public class AliNotifyBaseInput + { + /// <summary> + /// 閫氱煡鐨勫彂閫佹椂闂淬�傛牸寮忎负 yyyy-MM-dd HH:mm:ss + /// </summary> + [JsonProperty("notify_time")] + [Required] + public DateTime? NotifyTime { get; set; } + + /// <summary> + /// 閫氱煡绫诲瀷 + /// </summary> + [JsonProperty("notify_type")] + [Required] + public string NotifyType { set; get; } + + /// <summary> + /// 閫氱煡鏍¢獙 ID + /// </summary> + [JsonProperty("notify_id")] + [Required] + public string NotifyId { set; get; } + + /// <summary> + /// 缂栫爜鏍煎紡銆傚 utf-8銆乬bk銆乬b312绛夈�� + /// </summary> + [JsonProperty("charset")] + [Required] + public string Charset { set; get; } + + /// <summary> + /// 璋冪敤鐨勬帴鍙g増鏈�傚浐瀹氫负1.0 + /// </summary> + [JsonProperty("version")] + [Required] + public string Version { set; get; } + + /// <summary> + /// 绛惧悕绫诲瀷銆傜鍚嶇畻娉曠被鍨嬶紝鐩墠鏀寔RSA2鍜孯SA锛屾帹鑽愪娇鐢� RSA2 + /// </summary> + [JsonProperty("sign_type")] + [Required] + public string SignType { set; get; } + + /// <summary> + /// 绛惧悕銆� + /// </summary> + [JsonProperty("sign")] + [Required] + public string Sign { set; get; } + + /// <summary> + /// 鎺堟潈鏂圭殑APPID銆傜敱浜庢湰鎺ュ彛鏆備笉寮�鏀剧涓夋柟搴旂敤鎺堟潈锛屽洜姝� auth_app_id=app_id + /// </summary> + [JsonProperty("auth_app_id")] + [Required] + public string AuthAppId { set; get; } + } +} \ No newline at end of file diff --git a/LifePayment/LifePayment.Domain.Shared/Ali/GetPayQrCodeInput.cs b/LifePayment/LifePayment.Domain.Shared/Ali/GetPayQrCodeInput.cs new file mode 100644 index 0000000..cd0fbd3 --- /dev/null +++ b/LifePayment/LifePayment.Domain.Shared/Ali/GetPayQrCodeInput.cs @@ -0,0 +1,28 @@ +锘縩amespace LifePayment.Domain.Shared +{ + public class GetPayQrCodeInput + { + /// <summary> + /// 璁㈠崟鏍囬 + /// </summary> + public string Subject { get; set; } + + /// <summary> + /// 浜ゆ槗鍒涘缓鏃朵紶鍏ョ殑鍟嗘埛璁㈠崟鍙� + /// </summary> + public string OutTradeNo { get; set; } + + /// <summary> + /// 璁㈠崟鎬婚噾棰濓紝鍗曚綅涓哄厓锛岀簿纭埌灏忔暟鐐瑰悗涓や綅锛屽彇鍊艰寖鍥碵0.01,100000000] + /// </summary> + public decimal TotalAmount { get; set; } + } + + public class OrderInQuiryInput + { + /// <summary> + /// 浜ゆ槗鍒涘缓鏃朵紶鍏ョ殑鍟嗘埛璁㈠崟鍙� + /// </summary> + public string OutTradeNo { get; set; } + } +} \ No newline at end of file diff --git a/LifePayment/LifePayment.Domain.Shared/AlipayModel/AliPayEcsignConstant.cs b/LifePayment/LifePayment.Domain.Shared/AlipayModel/AliPayEcsignConstant.cs new file mode 100644 index 0000000..7f33730 --- /dev/null +++ b/LifePayment/LifePayment.Domain.Shared/AlipayModel/AliPayEcsignConstant.cs @@ -0,0 +1,42 @@ +锘縰sing Nest; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace LifePayment.Domain +{ + public class AliPayEcsignConstant + { + public const string SuccessCode = "10000"; + + public const string OptionsName = "AliPayEcsign"; + + public static class AliPayEcsignApiMethod + { + public const string SealSave = "alipay.financialnet.auth.ecsign.seal.save"; + public const string SealBatchQuery = "alipay.financialnet.auth.ecsign.seal.batchquery"; + public const string SealAuth = "alipay.financialnet.auth.ecsign.seal.auth"; + public const string FileUpload = "alipay.open.file.upload"; + public const string TemplateSave = "alipay.financialnet.auth.ecsign.template.save"; + public const string TemplateBatchQuery = "alipay.financialnet.auth.ecsign.template.batchquery"; + public const string TemplateQuery = "alipay.financialnet.auth.ecsign.template.query"; + public const string SolutionSave = "alipay.financialnet.auth.ecsign.solution.save"; + public const string SolutionBatchQuery = "alipay.financialnet.auth.ecsign.solution.batchquery"; + public const string SolutionQuery = "alipay.financialnet.auth.ecsign.solution.query"; + public const string DataprepareCreate = "alipay.financialnet.auth.ecsign.dataprepare.create"; + public const string SignorderSigned = "alipay.financialnet.auth.ecsign.signorder.signed"; + public const string SignorderQuery = "alipay.financialnet.auth.ecsign.signorder.query"; + } + + public static class AliPayEcsignSignBizCode + { + /// <summary> + /// 鍚堝悓妯℃澘鏂囦欢涓婁紶 + /// </summary> + public const string EcsignContractUpload = "ecsign_contract_upload"; + + } + } +} diff --git a/LifePayment/LifePayment.Domain.Shared/AlipayModel/AliPayEcsignInterfaceInput.cs b/LifePayment/LifePayment.Domain.Shared/AlipayModel/AliPayEcsignInterfaceInput.cs new file mode 100644 index 0000000..33b8412 --- /dev/null +++ b/LifePayment/LifePayment.Domain.Shared/AlipayModel/AliPayEcsignInterfaceInput.cs @@ -0,0 +1,523 @@ +锘縰sing Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace LifePayment.Domain.Shared; + +public class SealSaveInput +{ + /// <summary> + /// 鍗扮珷id锛屼负绌烘椂琛ㄧず娣诲姞锛屼笉涓虹┖鏃惰〃绀轰慨鏀� + /// </summary> + [JsonProperty("seal_id")] + public string? SealId { get; set; } + + /// <summary> + /// 鍗扮珷鍚嶇О + /// </summary> + [JsonProperty("seal_name")] + [Required(ErrorMessage = "鍗扮珷鍚嶇О鏄繀濉」")] + public string SealName { get; set; } + + /// <summary> + /// 鍗扮珷鎻忚堪 + /// </summary> + [JsonProperty("seal_description")] + [Required(ErrorMessage = "鍗扮珷鎻忚堪鏄繀濉」")] + public string SealDescription { get; set; } + + /// <summary> + /// 鍗扮珷绫诲瀷锛孍NTERPRISE-浼佷笟鍏珷锛孍NTERPRISE_WITH_CODE-甯︽湁缁熶竴绀句細浠g爜鐨勪紒涓氬叕绔狅紝CONTRACT-鍚堝悓涓撶敤绔� + /// </summary> + [JsonProperty("seal_type")] + [Required(ErrorMessage = "鍗扮珷绫诲瀷鏄繀濉」")] + public string SealType { get; set; } + + /// <summary> + /// 浼佷笟鍚嶇О + /// </summary> + [JsonProperty("enterprise_name")] + [Required(ErrorMessage = "浼佷笟鍚嶇О鏄繀濉」")] + public string EnterpriseName { get; set; } + + /// <summary> + /// 缁熶竴绀句細淇$敤浠g爜 + /// </summary> + [JsonProperty("enterprise_cert_no")] + [Required(ErrorMessage = "缁熶竴绀句細淇$敤浠g爜鏄繀濉」")] + public string EnterpriseCertNo { get; set; } +} + +public class SealBatchQueryInput +{ + /// <summary> + /// 鍗扮珷id + /// </summary> + [JsonProperty("seal_id")] + public string? SealId { get; set; } + + /// <summary> + /// 鍗扮珷鍚嶇О + /// </summary> + [JsonProperty("seal_name")] + public string? SealName { get; set; } + + /// <summary> + /// 椤垫暟锛岄粯璁�1锛屽繀椤诲ぇ浜�0 + /// </summary> + [JsonProperty("page_no")] + [Range(1, int.MaxValue, ErrorMessage = "椤垫暟蹇呴』澶т簬0")] + public int PageNo { get; set; } = 1; + + /// <summary> + /// 椤甸潰澶у皬锛岄粯璁�200锛屽繀椤诲ぇ浜�0 + /// </summary> + [JsonProperty("page_size")] + [Range(1, int.MaxValue, ErrorMessage = "椤甸潰澶у皬蹇呴』澶т簬0")] + public int PageSize { get; set; } = 200; +} + +public class SealAuthInput +{ + /// <summary> + /// 鍗扮珷ID + /// </summary> + [JsonProperty("seal_id")] + [Required(ErrorMessage = "鍗扮珷ID鏄繀濉」")] + public string SealId { get; set; } + + /// <summary> + /// 鎺堟潈寮�濮嬫椂闂� + /// </summary> + [JsonProperty("auth_start_date")] + [Required(ErrorMessage = "鎺堟潈寮�濮嬫椂闂存槸蹇呭~椤�")] + public DateTime AuthStartDate { get; set; } + + /// <summary> + /// 鎺堟潈缁撴潫鏃堕棿 + /// </summary> + [JsonProperty("auth_end_date")] + [Required(ErrorMessage = "鎺堟潈缁撴潫鏃堕棿鏄繀濉」")] + public DateTime AuthEndDate { get; set; } +} + +public class FileUploadInput +{ + /// <summary> + /// 涓氬姟缂栫爜锛歟csign_contract_upload + /// </summary> + [JsonProperty("biz_code")] + [Required(ErrorMessage = "涓氬姟缂栫爜鏄繀濉」")] + public string BizCode { get; set; } = AliPayEcsignConstant.AliPayEcsignSignBizCode.EcsignContractUpload; + + /// <summary> + /// 鏂囦欢鐨刴d5鍊硷紝濡傛灉涓嶄紶鍒欎笉鏍¢獙md5 + /// </summary> + [JsonProperty("md5")] + public string? Md5 { get; set; } + + /// <summary> + /// 鏂囦欢鍐呭鐨勪簩杩涘埗娴� + /// </summary> + [JsonIgnore] + [Required(ErrorMessage = "鏂囦欢鍐呭鏄繀濉」")] + public byte[] FileContent { get; set; } + + /// <summary> + /// 鏂囦欢鍚嶇О + /// </summary> + [JsonIgnore] + public string FileName { get; set; } +} + +public class TemplateSaveInput +{ + /// <summary> + /// 妯℃澘ID锛屼负绌烘椂琛ㄧず娣诲姞锛屼笉涓虹┖鏃惰〃绀轰慨鏀� + /// </summary> + [JsonProperty("template_id")] + public string? TemplateId { get; set; } + + /// <summary> + /// 妯℃澘鍚嶇О锛屽悗缁細灞曠ず缁欑敤鎴� + /// </summary> + [JsonProperty("template_name")] + [Required(ErrorMessage = "妯℃澘鍚嶇О鏄繀濉」")] + public string TemplateName { get; set; } + + /// <summary> + /// 妯℃澘鎻忚堪 + /// </summary> + [JsonProperty("template_memo")] + [Required(ErrorMessage = "妯℃澘鎻忚堪鏄繀濉」")] + public string TemplateMemo { get; set; } + + /// <summary> + /// 鏂囦欢ID + /// </summary> + [JsonProperty("template_file_id")] + [Required(ErrorMessage = "鏂囦欢ID鏄繀濉」")] + public string TemplateFileId { get; set; } + + /// <summary> + /// 浼佷笟鍗扮珷鎺т欢鍒楄〃 + /// </summary> + [JsonProperty("corporate_seal_rects")] + public List<RectItem> CorporateSealRects { get; set; } = new List<RectItem>(); + + /// <summary> + /// 涓汉鍗扮珷鎺т欢鍒楄〃 + /// </summary> + [JsonProperty("personal_seal_rects")] + public List<PersonalSealRectItem> PersonalSealRects { get; set; } = new List<PersonalSealRectItem>(); + + /// <summary> + /// 鏃堕棿鎴虫帶浠跺垪琛� + /// </summary> + [JsonProperty("time_stamp_rects")] + public List<TimeStampRectItem> TimeStampRects { get; set; } = new List<TimeStampRectItem>(); + + /// <summary> + /// 鍗曡鏂囨湰妗嗘帶浠跺垪琛� + /// </summary> + [JsonProperty("singleline_text_rects")] + [Required(ErrorMessage = "鍗曡鏂囨湰妗嗘帶浠跺垪琛ㄦ槸蹇呭~椤�")] + public List<TextRectItem> SinglelineTextRects { get; set; } = new List<TextRectItem>(); + + /// <summary> + /// 澶氳鏂囨湰妗嗘帶浠跺垪琛� + /// </summary> + [JsonProperty("multilineTextRects")] + public List<TextRectItem> MultilineTextRects { get; set; } = new List<TextRectItem>(); +} + +public class RectItem +{ + /// <summary> + /// 杈撳叆椤规帶浠跺敮涓�琛ㄧずID锛屼娇鐢ㄦā鏉挎椂鍙互鏍规嵁rect_id杩涜濉厖 + /// </summary> + [JsonProperty("rect_id")] + [Required(ErrorMessage = "鎺т欢ID鏄繀濉」")] + public string RectId { get; set; } + + /// <summary> + /// 鎺т欢鍚嶇О + /// </summary> + [JsonProperty("rect_name")] + [Required(ErrorMessage = "鎺т欢鍚嶇О鏄繀濉」")] + public string RectName { get; set; } + + /// <summary> + /// PDF椤电爜 + /// </summary> + [JsonProperty("page")] + [Required(ErrorMessage = "PDF椤电爜鏄繀濉」")] + public int Page { get; set; } + + /// <summary> + /// x杞村潗鏍囷紝宸︿笅瑙掍负鍘熺偣 + /// </summary> + [JsonProperty("offset_x")] + [Required(ErrorMessage = "x杞村潗鏍囨槸蹇呭~椤�")] + public int OffsetX { get; set; } + + /// <summary> + /// y杞村潗鏍囷紝宸︿笅瑙掍负鍘熺偣 + /// </summary> + [JsonProperty("offset_y")] + [Required(ErrorMessage = "y杞村潗鏍囨槸蹇呭~椤�")] + public int OffsetY { get; set; } +} + +public class PersonalSealRectItem : RectItem +{ + /// <summary> + /// 涓汉绛剧珷鏂瑰紡锛歅ERSONAL_SEAL-鐢靛瓙绛剧珷锛孒AND_WRITE-鎵嬪啓绛惧悕 + /// </summary> + [JsonProperty("signature_type")] + public string? SignatureType { get; set; } +} + +public class TimeStampRectItem : RectItem +{ + /// <summary> + /// 鏃堕棿鎴虫牸寮忥細yyyy-MM-dd锛寉yyy/MM/dd锛寉yyy骞碝M鏈坉d鏃� + /// </summary> + [JsonProperty("time_format")] + [Required(ErrorMessage = "鏃堕棿鎴虫牸寮忔槸蹇呭~椤�")] + public string TimeFormat { get; set; } +} + +public class TextRectItem : RectItem +{ + /// <summary> + /// 鏄惁蹇呭~锛岄粯璁rue + /// </summary> + [JsonProperty("required")] + public bool Required { get; set; } = true; + + /// <summary> + /// 鎺т欢鏍峰紡 + /// </summary> + [JsonProperty("rectStyle")] + [Required(ErrorMessage = "鎺т欢鏍峰紡鏄繀濉」")] + public RectStyle RectStyle { get; set; } +} + +public class RectStyle +{ + /// <summary> + /// 鎺т欢瀹藉害锛屾枃瀛楄秴鍑洪儴鍒嗕細琚鍓� + /// </summary> + [JsonProperty("width")] + [Required(ErrorMessage = "鎺т欢瀹藉害鏄繀濉」")] + public double Width { get; set; } + + /// <summary> + /// 鎺т欢楂樺害 + /// </summary> + [JsonProperty("height")] + public double Height { get; set; } = 22.0; + + /// <summary> + /// 濉厖瀛椾綋锛岄粯璁� 1-瀹嬩綋 + /// </summary> + [JsonProperty("font")] + public int Font { get; set; } = 1; + + /// <summary> + /// 濉厖瀛椾綋澶у皬锛岄粯璁�12 + /// </summary> + [JsonProperty("font_size")] + public int FontSize { get; set; } = 12; + + /// <summary> + /// 濉厖瀛椾綋棰滆壊锛岄粯璁�#000000 榛戣壊 + /// </summary> + [JsonProperty("text_color")] + public string TextColor { get; set; } = "#000000"; +} + +public class TemplateBatchQueryInput +{ + /// <summary> + /// 妯℃澘ID锛堝彲閫夛級 + /// </summary> + [JsonProperty("template_id")] + public string TemplateId { get; set; } + + /// <summary> + /// 妯℃澘鍚嶇О锛堝彲閫夛級 + /// </summary> + [JsonProperty("template_name")] + public string TemplateName { get; set; } + + /// <summary> + /// 椤垫暟锛岄粯璁�1锛屽繀椤诲ぇ浜�0锛堝彲閫夛級 + /// </summary> + [JsonProperty("page_no")] + public int PageNo { get; set; } = 1; + + /// <summary> + /// 椤甸潰澶у皬锛岄粯璁�200锛堝彲閫夛級 + /// </summary> + [JsonProperty("page_size")] + public int PageSize { get; set; } = 200; +} + +public class TemplateQueryInput +{ + [JsonProperty("template_id")] + public string TemplateId { get; set; } +} + +public class SolutionSaveInput +{ + /// <summary> + /// 绛剧害鏂规缂栫爜锛屼负绌烘椂琛ㄧず娣诲姞锛屼笉涓虹┖鏃惰〃绀轰慨鏀� + /// </summary> + [JsonProperty("solution_code")] + public string? SolutionCode { get; set; } + + /// <summary> + /// 绛剧害鏂规鍚嶇О锛岀缃叉椂浼氬瀹㈠睍绀� + /// </summary> + [JsonProperty("solution_name")] + [Required(ErrorMessage = "绛剧害鏂规鍚嶇О鏄繀濉」")] + public string SolutionName { get; set; } + + /// <summary> + /// 绛剧害鏂规鎻忚堪 + /// </summary> + [JsonProperty("solution_description")] + [Required(ErrorMessage = "绛剧害鏂规鎻忚堪鏄繀濉」")] + public string SolutionDescription { get; set; } + + /// <summary> + /// 绛剧害鍚堝悓鍒楄〃 + /// </summary> + [JsonProperty("template_vo_list")] + [Required(ErrorMessage = "绛剧害鍚堝悓鍒楄〃鏄繀濉」")] + public List<TemplateVo> TemplateVoList { get; set; } = new List<TemplateVo>(); + + /// <summary> + /// 绛剧害鏍歌韩閰嶇疆 + /// </summary> + [JsonProperty("attribute_vo_list")] + [Required(ErrorMessage = "绛剧害鏍歌韩閰嶇疆鏄繀濉」")] + public List<AttributeVo> AttributeVoList { get; set; } = new List<AttributeVo>(); +} + +public class TemplateVo +{ + /// <summary> + /// 鍚堝悓妯℃澘ID + /// </summary> + [JsonProperty("template_id")] + [Required(ErrorMessage = "鍚堝悓妯℃澘ID鏄繀濉」")] + public string TemplateId { get; set; } +} + +public class AttributeVo +{ + /// <summary> + /// 绛剧害鏂瑰紡锛欵XTERNAL_H5-绔H5锛孧INI_APP-鏀粯瀹濆皬绋嬪簭/鎻掍欢 + /// </summary> + [JsonProperty("access_config_code")] + [Required(ErrorMessage = "绛剧害鏂瑰紡鏄繀濉」")] + public string AccessConfigCode { get; set; } + + /// <summary> + /// 鏍歌韩鏂瑰紡锛� + /// EXTERNAL_H5_SMS-绔H5锛� + /// FACE_PASSWORD_ALIPAY-鏀粯瀹濆皬绋嬪簭/鎻掍欢 + /// </summary> + [JsonProperty("verify_code")] + [Required(ErrorMessage = "鏍歌韩鏂瑰紡鏄繀濉」")] + public string VerifyCode { get; set; } +} + +public class SolutionBatchQueryInput +{ + /// <summary> + /// 绛剧害鏂规缂栫爜 + /// </summary> + [JsonProperty("solution_code")] + public string? SolutionCode { get; set; } + + /// <summary> + /// 绛剧害鏂规鍚嶇О + /// </summary> + [JsonProperty("solution_name")] + public string? SolutionName { get; set; } + + /// <summary> + /// 椤垫暟锛岄粯璁�1锛屽繀椤诲ぇ浜�0 + /// </summary> + [JsonProperty("page_no")] + [Range(1, int.MaxValue, ErrorMessage = "椤垫暟蹇呴』澶т簬0")] + public int PageNo { get; set; } = 1; + + /// <summary> + /// 椤甸潰澶у皬锛岄粯璁�200 + /// </summary> + [JsonProperty("page_size")] + [Range(1, int.MaxValue, ErrorMessage = "椤甸潰澶у皬蹇呴』澶т簬0")] + public int PageSize { get; set; } = 200; +} + +public class SolutionQueryInput +{ + /// <summary> + /// 绛剧害鏂规缂栫爜 + /// </summary> + [JsonProperty("solution_code")] + public string SolutionCode { get; set; } +} + +public class DataprepareCreateInput +{ + /// <summary> + /// 涓氬姟娴佹按鍙凤紝涓氬姟闇�淇濊瘉鍐呴儴鍞竴 + /// </summary> + [JsonProperty("out_order_no")] + [Required(ErrorMessage = "涓氬姟娴佹按鍙锋槸蹇呭~椤�")] + public string OutOrderNo { get; set; } + + /// <summary> + /// 绛剧害鏂规缂栫爜锛岀绾︽柟妗堢鐞嗕腑鏂板鑾峰緱 + /// </summary> + [JsonProperty("solution_code")] + [Required(ErrorMessage = "绛剧害鏂规缂栫爜鏄繀濉」")] + public string SolutionCode { get; set; } + + /// <summary> + /// 璺宠浆绫诲瀷锛孨ORMAL-閾炬帴璺宠浆 + /// </summary> + [JsonProperty("jump_type")] + [Required(ErrorMessage = "璺宠浆绫诲瀷鏄繀濉」")] + public string JumpType { get; set; } = "NORMAL"; + + /// <summary> + /// 绛剧害鐢ㄦ埛淇℃伅 + /// </summary> + [JsonIgnore] + [Required(ErrorMessage = "绛剧害鐢ㄦ埛淇℃伅鏄繀濉」")] + public SignUser SignUser { get; set; } + + /// <summary> + /// 鍚堝悓妯℃澘鍙傛暟 + /// </summary> + [JsonIgnore] + public Dictionary<string, object> TemplateData { get; set; } + + /// <summary> + /// 绛剧害鎵╁睍瀛楁锛屾棤闇�浼犲叆锛屽彧闇�瑕佷紶鍏ignUser鍜孴emplateData 灏嗘牴鎹繖涓や釜瀛楁鑷姩鐢熸垚锛屽~鍐欑敤鎴蜂俊鎭互鍙婃帶浠秗ect_id鐨剉alue鍊硷紝鏌ョ湅鍚堝悓鏃朵細杩涜鏍¢獙 + /// </summary> + [JsonProperty("ext_info")] + public string ExtInfo { get; set; } +} + +public class SignUser +{ + /// <summary> + /// 绛剧害鐨勭敤鎴峰鍚� + /// </summary> + [JsonProperty("signerName")] + [Required(ErrorMessage = "绛剧害鐨勭敤鎴峰鍚嶆槸蹇呭~椤�")] + public string SignerName { get; set; } + + /// <summary> + /// 绛剧害鐨勭敤鎴疯韩浠借瘉鍙� + /// </summary> + [JsonProperty("certNo")] + [Required(ErrorMessage = "绛剧害鐨勭敤鎴疯韩浠借瘉鍙锋槸蹇呭~椤�")] + public string CertNo { get; set; } + + /// <summary> + /// 绛剧害鐨勭敤鎴锋墜鏈哄彿 + /// </summary> + [JsonProperty("bindedMobile")] + public string? BindedMobile { get; set; } +} + +public class SignorderQueryInput +{ + /// <summary> + /// 绛剧害鏂规缂栫爜 + /// </summary> + [JsonProperty("solution_code")] + [Required(ErrorMessage = "绛剧害鏂规缂栫爜鏄繀濉」")] + public string SolutionCode { get; set; } + + /// <summary> + /// 鍙戣捣绛剧害鐨勪笟鍔℃祦姘村彿 + /// </summary> + [JsonProperty("out_order_no")] + [Required(ErrorMessage = "鍙戣捣绛剧害鐨勪笟鍔℃祦姘村彿鏄繀濉」")] + public string OutOrderNo { get; set; } +} diff --git a/LifePayment/LifePayment.Domain.Shared/AlipayModel/AliPayEcsignInterfaceOutput.cs b/LifePayment/LifePayment.Domain.Shared/AlipayModel/AliPayEcsignInterfaceOutput.cs new file mode 100644 index 0000000..f8aaba3 --- /dev/null +++ b/LifePayment/LifePayment.Domain.Shared/AlipayModel/AliPayEcsignInterfaceOutput.cs @@ -0,0 +1,528 @@ +锘縰sing Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Tea; + +namespace LifePayment.Domain.Shared; + +public class AliPayEcsignInterfaceBaseOutput : TeaModel +{ + /// <summary> + /// 涓氬姟鐮侊紝10000琛ㄧず鎴愬姛 + /// </summary> + [NameInMap("code")] + public string Code { get; set; } + + /// <summary> + /// 寮傚父淇℃伅 + /// </summary> + [NameInMap("sub_msg")] + public string SubMsg { get; set; } + + // public bool IsSuccess() => Code == AliPayEcsignConstant.SuccessCode; +} + +public class SealSaveOutput : AliPayEcsignInterfaceBaseOutput +{ + /// <summary> + /// 鍗扮珷ID + /// </summary> + [NameInMap("seal_id")] + public string SealId { get; set; } +} + + +public class SealBatchQueryOutput : AliPayEcsignInterfaceBaseOutput +{ + /// <summary> + /// 椤垫暟锛岄粯璁�1锛屽繀椤诲ぇ浜�0 + /// </summary> + [NameInMap("page_no")] + public int PageNo { get; set; } = 1; + + /// <summary> + /// 椤甸潰澶у皬锛岄粯璁�200 + /// </summary> + [NameInMap("page_size")] + public int PageSize { get; set; } = 200; + + /// <summary> + /// 鎬绘暟 + /// </summary> + [NameInMap("total_count")] + public int TotalCount { get; set; } + + /// <summary> + /// 鍗扮珷鍒楄〃 + /// </summary> + [NameInMap("seal_list")] + public List<SealInfo> SealList { get; set; } = new List<SealInfo>(); +} + +// 瀛愮被鐢ㄤ簬鍗扮珷淇℃伅 +public class SealInfo : TeaModel +{ + /// <summary> + /// 鍗扮珷ID + /// </summary> + [NameInMap("seal_id")] + public string SealId { get; set; } + + /// <summary> + /// 鍗扮珷鍚嶇О + /// </summary> + [NameInMap("seal_name")] + public string SealName { get; set; } + + /// <summary> + /// 鍗扮珷绫诲瀷 + /// </summary> + [NameInMap("seal_type")] + public string SealType { get; set; } + + /// <summary> + /// 鍗扮珷鐘舵�侊紝INIT-鍒濆鍖栵紝NORMAL-姝e父鍙敤锛孉PPROVING-鎺堟潈涓紝CANCEL-澶辨晥涓嶅彲鐢� + /// </summary> + [NameInMap("seal_status")] + public string SealStatus { get; set; } + + /// <summary> + /// 鍗扮珷棰勮閾炬帴 + /// </summary> + [NameInMap("preview_url")] + public string PreviewUrl { get; set; } + + /// <summary> + /// 浼佷笟鍚嶇О + /// </summary> + [NameInMap("enterprise_name")] + public string EnterpriseName { get; set; } + + /// <summary> + /// 缁熶竴绀句細淇$敤浠g爜 + /// </summary> + [NameInMap("enterprise_cert_no")] + public string EnterpriseCertNo { get; set; } + + /// <summary> + /// 鍒涘缓鏃堕棿 + /// </summary> + [NameInMap("gmt_create")] + public DateTime GmtCreate { get; set; } + + /// <summary> + /// 鏇存柊鏃堕棿 + /// </summary> + [NameInMap("gmt_modified")] + public DateTime GmtModified { get; set; } +} + +public class SealAuthOutput : AliPayEcsignInterfaceBaseOutput +{ + /// <summary> + /// 鎺堟潈璋冩暣閾炬帴锛屽皢閾炬帴缁欏埌瀵瑰簲浼佷笟锛岃鍏惰繘琛岀绾︽巿鏉� + /// </summary> + [NameInMap("auth_jump_url")] + public string AuthJumpUrl { get; set; } +} + + +public class FileUploadOutput : AliPayEcsignInterfaceBaseOutput +{ + /// <summary> + /// 鏂囦欢ID + /// </summary> + [NameInMap("file_id")] + public string FileId { get; set; } +} + +public class TemplateSaveOutput : AliPayEcsignInterfaceBaseOutput +{ + /// <summary> + /// 鍚堝悓妯℃澘ID锛屽悗缁敤浜庨厤缃绾︽柟妗� + /// </summary> + [NameInMap("template_id")] + public string TemplateId { get; set; } +} + +// 缁ф壙鑷熀绫荤殑鍏蜂綋杈撳嚭绫� +public class TemplateBatchQueryOutput : AliPayEcsignInterfaceBaseOutput +{ + /// <summary> + /// 鏁版嵁鍒楄〃 + /// </summary> + [NameInMap("data_list")] + public List<TemplateInfo> DataList { get; set; } = new List<TemplateInfo>(); +} + +// 瀛愮被鐢ㄤ簬鍚堝悓妯℃澘淇℃伅 +public class TemplateInfo : TeaModel +{ + /// <summary> + /// 鍚堝悓妯℃澘ID + /// </summary> + [NameInMap("template_id")] + public string TemplateId { get; set; } + + /// <summary> + /// 鍚堝悓妯℃澘鍚嶇О + /// </summary> + [NameInMap("template_name")] + public string TemplateName { get; set; } + + /// <summary> + /// 鍚堝悓妯℃澘鎻忚堪 + /// </summary> + [NameInMap("template_memo")] + public string TemplateMemo { get; set; } + + /// <summary> + /// 鍚堝悓妯℃澘绫诲瀷 + /// </summary> + [NameInMap("template_type")] + public string TemplateType { get; set; } +} + +// 缁ф壙鑷熀绫荤殑鍏蜂綋杈撳嚭绫� +public class TemplateQueryOutput : AliPayEcsignInterfaceBaseOutput +{ + /// <summary> + /// 鏁版嵁鍒楄〃 + /// </summary> + [NameInMap("contract_template_open_vo")] + public List<ContractTemplateOpenVo> ContractTemplateOpenVoList { get; set; } = new List<ContractTemplateOpenVo>(); +} + +// 瀛愮被鐢ㄤ簬鍚堝悓妯℃澘淇℃伅 +public class ContractTemplateOpenVo : TeaModel +{ + /// <summary> + /// 鍚堝悓妯℃澘ID + /// </summary> + [NameInMap("template_id")] + public string TemplateId { get; set; } + + /// <summary> + /// 鍚堝悓妯℃澘鍚嶇О + /// </summary> + [NameInMap("template_name")] + public string TemplateName { get; set; } + + /// <summary> + /// 鍚堝悓妯℃澘鎻忚堪 + /// </summary> + [NameInMap("template_memo")] + public string TemplateMemo { get; set; } + + /// <summary> + /// 鍚堝悓妯℃澘绫诲瀷 + /// </summary> + [NameInMap("template_type")] + public string TemplateType { get; set; } + + /// <summary> + /// 鍚堝悓鏂囦欢棰勮閾炬帴 + /// </summary> + [NameInMap("preview_url")] + public string PreviewUrl { get; set; } + + /// <summary> + /// 浼佷笟鍗扮珷鎺т欢鍒楄〃 + /// </summary> + [NameInMap("corporate_seal_rects")] + public List<RectItem> CorporateSealRects { get; set; } = new List<RectItem>(); + + /// <summary> + /// 涓汉鍗扮珷鎺т欢鍒楄〃 + /// </summary> + [NameInMap("personal_seal_rects")] + public List<PersonalSealRectItem> PersonalSealRects { get; set; } = new List<PersonalSealRectItem>(); + + /// <summary> + /// 鏃堕棿鎴虫帶浠跺垪琛� + /// </summary> + [NameInMap("time_stamp_rects")] + public List<TimeStampRectItem> TimeStampRects { get; set; } = new List<TimeStampRectItem>(); + + /// <summary> + /// 鍗曡鏂囨湰妗嗘帶浠跺垪琛� + /// </summary> + [NameInMap("singleline_text_rects")] + public List<TextRectItem> SinglelineTextRects { get; set; } = new List<TextRectItem>(); + + /// <summary> + /// 澶氳鏂囨湰妗嗘帶浠跺垪琛� + /// </summary> + [NameInMap("multiline_text_rects")] + public List<TextRectItem> MultilineTextRects { get; set; } = new List<TextRectItem>(); +} + +public class SolutionSaveOutput : AliPayEcsignInterfaceBaseOutput +{ + /// <summary> + /// 绛剧害鏂规缂栫爜 + /// </summary> + [NameInMap("solution_code")] + public string SolutionCode { get; set; } +} + +public class SolutionBatchQueryOutput : AliPayEcsignInterfaceBaseOutput +{ + /// <summary> + /// 椤垫暟锛岄粯璁�1锛屽繀椤诲ぇ浜�0 + /// </summary> + [NameInMap("page_no")] + public int PageNo { get; set; } = 1; + + /// <summary> + /// 椤甸潰澶у皬锛岄粯璁�200 + /// </summary> + [NameInMap("page_size")] + public int PageSize { get; set; } = 200; + + /// <summary> + /// 鎬绘暟 + /// </summary> + [NameInMap("total_count")] + public int TotalCount { get; set; } + + /// <summary> + /// 绛剧害鏂规缂栫爜鍒楄〃 + /// </summary> + [NameInMap("solution_list")] + public List<SolutionInfo> SolutionList { get; set; } = new List<SolutionInfo>(); +} + +// 瀛愮被鐢ㄤ簬绛剧害鏂规淇℃伅 +public class SolutionInfo : TeaModel +{ + /// <summary> + /// 绛剧害鏂规鍚嶇О + /// </summary> + [NameInMap("solution_name")] + public string SolutionName { get; set; } + + /// <summary> + /// 绛剧害鏂规缂栫爜 + /// </summary> + [NameInMap("solution_code")] + public string SolutionCode { get; set; } + + /// <summary> + /// 鍒涘缓鏃堕棿 + /// </summary> + [NameInMap("gmt_create")] + public DateTime GmtCreate { get; set; } + + /// <summary> + /// 鏇存柊鏃堕棿 + /// </summary> + [NameInMap("gmt_modified")] + public DateTime GmtModified { get; set; } +} + +public class SolutionQueryOutput : AliPayEcsignInterfaceBaseOutput +{ + /// <summary> + /// 绛惧悕鏂规瀵硅薄 + /// </summary> + [NameInMap("solution_vo")] + public SolutionVo SolutionVo { get; set; } + + +} + +// 瀛愮被鐢ㄤ簬绛惧悕鏂规淇℃伅 +public class SolutionVo : TeaModel +{ + /// <summary> + /// 绛剧害鏂规缂栫爜 + /// </summary> + [NameInMap("solution_code")] + public string SolutionCode { get; set; } + + /// <summary> + /// 绛剧害鏂规鍚嶇О + /// </summary> + [NameInMap("solution_name")] + public string SolutionName { get; set; } + + /// <summary> + /// 鍒涘缓鏃堕棿 + /// </summary> + [NameInMap("gmt_create")] + public DateTime GmtCreate { get; set; } + + /// <summary> + /// 鏇存柊鏃堕棿 + /// </summary> + [NameInMap("gmt_modified")] + public DateTime GmtModified { get; set; } + + /// <summary> + /// 妯℃澘鍒楄〃 + /// </summary> + [NameInMap("template_list")] + public List<SolutionTemplateInfo> TemplateList { get; set; } = new List<SolutionTemplateInfo>(); + + /// <summary> + /// 鍏朵粬灞炴�� + /// </summary> + [NameInMap("attribute_vo_list")] + public List<SolutionAttributeVo> AttributeVoList { get; set; } = new List<SolutionAttributeVo>(); +} + +// 瀛愮被鐢ㄤ簬妯℃澘淇℃伅 +public class SolutionTemplateInfo : TeaModel +{ + /// <summary> + /// 妯℃澘ID + /// </summary> + [NameInMap("template_id")] + public string TemplateId { get; set; } + + /// <summary> + /// 妯℃澘鍚嶇О + /// </summary> + [NameInMap("template_name")] + public string TemplateName { get; set; } + + /// <summary> + /// 妯℃澘绫诲瀷 + /// </summary> + [NameInMap("template_type")] + public string TemplateType { get; set; } + + /// <summary> + /// 鍚堝悓鏄惁蹇呰锛岄粯璁alse + /// </summary> + [NameInMap("must_read")] + public bool MustRead { get; set; } = false; +} + +// 瀛愮被鐢ㄤ簬鍏朵粬灞炴�т俊鎭� +public class SolutionAttributeVo : TeaModel +{ + /// <summary> + /// 绛剧害鏂瑰紡 + /// </summary> + [NameInMap("access_config_code")] + public string AccessConfigCode { get; set; } + + /// <summary> + /// 鏍歌韩鏂瑰紡 + /// </summary> + [NameInMap("verify_code")] + public string VerifyCode { get; set; } +} + +public class DataprepareCreateOutput : AliPayEcsignInterfaceBaseOutput +{ + /// <summary> + /// 绛剧害闀块摼鎺� + /// </summary> + [NameInMap("jump_url")] + public string JumpUrl { get; set; } + + /// <summary> + /// 鎵╁睍淇℃伅瀛楃涓� + /// </summary> + [NameInMap("ext_info")] + public string ExtInfoStr { get; set; } + + /// <summary> + /// 鎵╁睍淇℃伅瀵硅薄 + /// </summary> + public DataprepareCreateExtInfo ExtInfo { get; set; } +} + +// 瀛愮被鐢ㄤ簬鎵╁睍淇℃伅 +public class DataprepareCreateExtInfo : TeaModel +{ + /// <summary> + /// 绛剧害瀵嗛挜锛岀敤浜庤烦杞琀5椤甸潰鎴栬�呭敜璧锋敮浠樺疂绛剧害鎻掍欢浣跨敤 + /// </summary> + [NameInMap("contextParams")] + [JsonProperty("contextParams")] + public string ContextParams { get; set; } + + /// <summary> + /// 绛剧害鐭摼鎺� + /// </summary> + [NameInMap("shortUrl")] + [JsonProperty("shortUrl")] + public string ShortUrl { get; set; } +} + +public class SignorderQueryOutput : AliPayEcsignInterfaceBaseOutput +{ + /// <summary> + /// 绛剧害璁㈠崟鍙� + /// </summary> + [NameInMap("sign_order_no")] + public string SignOrderNo { get; set; } + + /// <summary> + /// 璁㈠崟鐘舵�侊細INIT-鍒濆鍖栵紝FAIL-绛剧害澶辫触锛孲UCCESS-绛剧害鎴愬姛 + /// </summary> + [NameInMap("order_status")] + public string OrderStatus { get; set; } + + /// <summary> + /// 绛剧害鏂规鐮� + /// </summary> + [NameInMap("solution_code")] + public string SolutionCode { get; set; } + + /// <summary> + /// 鍒涘缓鏃堕棿 + /// </summary> + [NameInMap("gmt_create")] + public DateTime GmtCreate { get; set; } + + /// <summary> + /// 鏇存柊鏃堕棿 + /// </summary> + [NameInMap("gmt_modified")] + public DateTime GmtModified { get; set; } + + /// <summary> + /// 鎵╁睍淇℃伅json + /// </summary> + [NameInMap("ext_info")] + public string ExtInfoStr { get; set; } + + /// <summary> + /// 鎵╁睍淇℃伅瀵硅薄 + /// </summary> + public SignorderQueryExtInfo ExtInfo { get; set; } +} + +public class SignorderQueryExtInfo : TeaModel +{ + /// <summary> + /// 鍚堝悓鏂囦欢鍒楄〃 + /// </summary> + [NameInMap("fileList")] + public List<FileDetail> FileList { get; set; } = new List<FileDetail>(); +} + +// 瀛愮被鐢ㄤ簬鍚堝悓鏂囦欢璇︽儏 +public class FileDetail : TeaModel +{ + /// <summary> + /// 鍚堝悓鏂囦欢鍚嶇О + /// </summary> + [NameInMap("fileName")] + public string FileName { get; set; } + + /// <summary> + /// 鍚堝悓棰勮閾炬帴 + /// </summary> + [NameInMap("previewUrl")] + public string PreviewUrl { get; set; } +} \ No newline at end of file diff --git a/LifePayment/LifePayment.Domain.Shared/AlipayModel/AlipayBaseOutput.cs b/LifePayment/LifePayment.Domain.Shared/AlipayModel/AlipayBaseOutput.cs new file mode 100644 index 0000000..b295694 --- /dev/null +++ b/LifePayment/LifePayment.Domain.Shared/AlipayModel/AlipayBaseOutput.cs @@ -0,0 +1,59 @@ +锘縰sing Newtonsoft.Json; +using System.ComponentModel.DataAnnotations; +using Tea; + +namespace LifePayment.Domain +{ + public class AlipayBaseOutput : TeaModel + { + /// <summary> + /// 缃戝叧杩斿洖鐮�,璇﹁鏂囨。 + /// </summary> + [NameInMap("code")] + public string Code + { + get; + set; + } + + /// <summary> + /// 缃戝叧杩斿洖鐮佹弿杩�,璇﹁鏂囨。 + /// </summary> + [NameInMap("msg")] + public string Msg + { + get; + set; + } + + /// <summary> + /// 涓氬姟杩斿洖鐮侊紝鍙傝鍏蜂綋鐨凙PI鎺ュ彛鏂囨。 + /// </summary> + [NameInMap("sub_code")] + public string SubCode + { + get; + set; + } + + /// <summary> + /// 涓氬姟杩斿洖鐮佹弿杩帮紝鍙傝鍏蜂綋鐨凙PI鎺ュ彛鏂囨。 + /// </summary> + [NameInMap("sub_msg")] + public string SubMsg + { + get; + set; + } + + /// <summary> + /// 绛惧悕,璇﹁鏂囨。 + /// </summary> + [NameInMap("sign")] + public string Sign + { + get; + set; + } + } +} diff --git a/LifePayment/LifePayment.Domain.Shared/AlipayModel/AlipayConstant.cs b/LifePayment/LifePayment.Domain.Shared/AlipayModel/AlipayConstant.cs new file mode 100644 index 0000000..8420d8e --- /dev/null +++ b/LifePayment/LifePayment.Domain.Shared/AlipayModel/AlipayConstant.cs @@ -0,0 +1,37 @@ +锘縰sing System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace LifePayment.Domain.Shared +{ + public class AlipayConstant + { + public const string PersonalProductCode = "FUND_SAFT_SIGN_WITHHOLDING_P"; + public const string SignScene = "INDUSTRY|SATF_ACC"; + public const string ProductCode_Sign = "FUND_SAFT_SIGN_WITHHOLDING"; + public const string ThirdPartyType = "PARTNER"; + public const string Channel = "QRCODE"; + public const string MerchantUserType = "BUSINESS_ORGANIZATION"; + public const string SceneCode = "SATF_FUND_BOOK"; + public const string ProductCode_Book = "FUND_ACCOUNT_BOOK"; + public const string IdentityType_Book = "ACCOUNT_BOOK_ID"; + public const string BizScene = "SATF_DEPOSIT"; + public const string DataBillErceiptType = "FUND_DETAIL"; + + public static WalletAccountOpenAlipayStatusEnum GetStatusForAlipay(string status) + { + return status switch + { + "NORMAL" => WalletAccountOpenAlipayStatusEnum.Normal, + + "STOP" => WalletAccountOpenAlipayStatusEnum.Pause, + + "TEMP" => WalletAccountOpenAlipayStatusEnum.NotEnabled, + _ => WalletAccountOpenAlipayStatusEnum.Unusual + }; + } + + } +} diff --git a/LifePayment/LifePayment.Domain.Shared/AlipayModel/DataBillErceiptApplyInput.cs b/LifePayment/LifePayment.Domain.Shared/AlipayModel/DataBillErceiptApplyInput.cs new file mode 100644 index 0000000..8c8b693 --- /dev/null +++ b/LifePayment/LifePayment.Domain.Shared/AlipayModel/DataBillErceiptApplyInput.cs @@ -0,0 +1,65 @@ +锘縰sing Newtonsoft.Json; +using System.ComponentModel.DataAnnotations; +using Tea; + +namespace LifePayment.Domain +{ + public class DataBillErceiptApplyInput + { + /// <summary> + /// 鐢宠鐨勭被鍨嬨�傚彲浼犲叆锛� + /// * ACCOUNT_LOG_DETAIL - 浣欓鏀舵敮璇佹槑 + /// * ACCOUNT_FLOW_DETAIL - 浣欓鏀舵敮娴佹按璇佹槑 + /// * FUND_DETAIL - 杞叆杞嚭鏀舵敮璇佹槑 + /// * ACCOUNT_LOG_SUM_DAILY - 鏀舵敮姹囨�昏瘉鏄庯紙鏃ユ眹鎬伙級 + /// * ACCOUNT_LOG_SUM_MONTHLY - 鏀舵敮姹囨�昏瘉鏄庯紙鏈堟眹鎬伙級 + /// </summary> + [JsonProperty("type", NullValueHandling = NullValueHandling.Ignore)] + [Required] + public string Type + { + get; + set; + } + + /// <summary> + /// 鏍规嵁涓嶅悓涓氬姟绫诲瀷锛屼紶鍏ヤ笉鍚屽弬鏁般�傛牸寮忓涓嬶細 + /// * ACCOUNT_LOG_DETAIL - 浼犲叆璐﹀姟娴佹按鍙凤紝绀轰緥锛�117007*********9151 + /// * ACCOUNT_FLOW_DETAIL - 浼犲叆娴佹按鏃ユ湡鍖洪棿绀轰緥锛�20220301-20220331 + /// * FUND_DETAIL - 浼犲叆璧勯噾鍗曟嵁鍙凤紝绀轰緥锛�2022051511007***************0731 + /// * ACCOUNT_LOG_SUM_DAILY - 浼犲叆鏃ユ湡锛岀ず渚嬶細2022-01-01 + /// * ACCOUNT_LOG_SUM_MONTHLY - 浼犲叆鏈堜唤锛岀ず渚嬶細2022-01 + /// </summary> + [JsonProperty("key", NullValueHandling = NullValueHandling.Ignore)] + [Required] + public string Key + { + get; + set; + } + + /// <summary> + /// ISV涓庡晢鎴风绾︽巿鏉冨崗璁彿銆� + /// </summary> + [JsonProperty("agreement_no", NullValueHandling = NullValueHandling.Ignore)] + public string AgreementNo + { + get; + set; + } + } + + public class DataBillErceiptApplyResponse : AlipayBaseOutput + { + /// <summary> + /// 鏂囦欢鐢宠鍙穎ile_id淇℃伅銆備娇鐢╢ile_id鍙互鏌ヨ澶勭悊鐘舵�� + /// </summary> + [NameInMap("file_id")] + public string FileId + { + get; + set; + } + + } +} diff --git a/LifePayment/LifePayment.Domain.Shared/AlipayModel/DataBillEreceiptQueryInput.cs b/LifePayment/LifePayment.Domain.Shared/AlipayModel/DataBillEreceiptQueryInput.cs new file mode 100644 index 0000000..35ec0e3 --- /dev/null +++ b/LifePayment/LifePayment.Domain.Shared/AlipayModel/DataBillEreceiptQueryInput.cs @@ -0,0 +1,70 @@ +锘縰sing Newtonsoft.Json; +using System.ComponentModel.DataAnnotations; +using Tea; + +namespace LifePayment.Domain +{ + public class DataBillEreceiptQueryInput + { + + /// <summary> + /// 鏂囦欢鐢宠鍙穎ile_id淇℃伅銆備娇鐢╢ile_id鍙互鏌ヨ澶勭悊鐘舵�� + /// </summary> + [JsonProperty("file_id", NullValueHandling = NullValueHandling.Ignore)] + [Required] + public string FileId + { + get; + set; + } + + + /// <summary> + /// ISV涓庡晢鎴风绾︽巿鏉冨崗璁彿銆� + /// </summary> + [JsonProperty("agreement_no", NullValueHandling = NullValueHandling.Ignore)] + public string AgreementNo + { + get; + set; + } + } + + public class DataBillEreceiptQueryResponse : AlipayBaseOutput + { + /// <summary> + /// 澶勭悊鐘舵�� + /// INIT - 鍒濆鍖� + /// PROCESS - 澶勭悊涓� + /// SUCCESS - 鎴愬姛 + /// FAIL - 澶辫触 + /// </summary> + [NameInMap("status")] + public string Status + { + get; + set; + } + + /// <summary> + /// 涓嬭浇閾炬帴銆俿tatus涓篠UCCESS鏃惰繑鍥炪�傜敤鎴峰彲浠ヤ娇鐢ㄦhttp閾炬帴涓嬭浇鏂囦欢鍐呭銆傛湁鏁堟椂闂�20s銆� + /// 鐢熸垚鐨勬枃浠舵槸zip鏍煎紡銆傞渶瑕佽В鍘嬪悗鑾峰彇鐢靛瓙鍥炲崟pdf鍐呭 + /// </summary> + [NameInMap("download_url")] + public string DownloadUrl + { + get; + set; + } + + /// <summary> + /// 濡傛灉鐢熸垚澶辫触锛屽垯浼氳繑鍥炲け璐ュ師鍥� + /// </summary> + [NameInMap("error_message")] + public string ErrorMessage + { + get; + set; + } + } +} diff --git a/LifePayment/LifePayment.Domain.Shared/AlipayModel/DataDataserviceBillDownloadUrlQueryInput.cs b/LifePayment/LifePayment.Domain.Shared/AlipayModel/DataDataserviceBillDownloadUrlQueryInput.cs new file mode 100644 index 0000000..86a119a --- /dev/null +++ b/LifePayment/LifePayment.Domain.Shared/AlipayModel/DataDataserviceBillDownloadUrlQueryInput.cs @@ -0,0 +1,63 @@ +锘縰sing Newtonsoft.Json; +using NPOI.OpenXmlFormats.Shared; +using System.ComponentModel.DataAnnotations; + +namespace LifePayment.Domain +{ + public class DataDataserviceBillDownloadUrlQueryInput + { + /// <summary> + /// 璐﹀崟绫诲瀷锛屽晢鎴烽�氳繃鎺ュ彛鎴栧晢鎴风粡寮�鏀惧钩鍙版巿鏉冨悗鍏舵墍灞炴湇鍔″晢閫氳繃鎺ュ彛鍙互鑾峰彇浠ヤ笅璐﹀崟绫诲瀷銆� + /// 銆愭灇涓惧�笺�� + /// 鍟嗘埛鍩轰簬鏀粯瀹濅氦鏄撴敹鍗曠殑涓氬姟璐﹀崟: trade + /// 鍩轰簬鍟嗘埛鏀粯瀹濅綑棰濇敹鍏ュ強鏀嚭绛夎祫閲戝彉鍔ㄧ殑璐﹀姟璐﹀崟: signcustomer + /// 钀ラ攢娲诲姩璐﹀崟锛屽寘鍚惀閿�娲诲姩鐨勫彂鏀撅紝鏍搁攢璁板綍: merchant_act + /// 鐩翠粯閫氫簩绾у晢鎴锋煡璇氦鏄撶殑涓氬姟璐﹀崟: trade_zft_merchant + /// 鐩翠粯閫氬钩鍙板晢鏌ヨ浜岀骇鍟嗘埛娴佹按浣跨敤锛岃繑鍥炴墍鏈変簩绾у晢鎴锋祦姘淬��: zft_acc + /// 姣忔棩缁撶畻鍒板崱鐨勮祫閲戝搴旂殑鏄庣粏锛屼笅杞藉唴瀹瑰寘鍚壒娆$粨绠楀埌鍗℃槑缁嗘枃浠讹紙绀轰緥锛夊拰鎵规缁撶畻鍒板崱姹囨�绘枃浠讹紙绀轰緥锛夛紱鑻ユ煡璇㈡椂闂磋寖鍥村唴鏈夊涓壒娆★紝浼氬皢澶氫釜鎵规鐨勬槑缁嗗拰姹囨�绘枃浠舵墦鍖呭埌涓�浠藉帇缂╁寘涓紱: settlementMerge + /// </summary> + [JsonProperty("bill_type", NullValueHandling = NullValueHandling.Ignore)] + [Required] + public string BillType + { + get; + set; + } + + /// <summary> + /// 璐﹀崟鏃堕棿锛� * 鏃ヨ处鍗曟牸寮忎负yyyy-MM-dd锛屾渶鏃╁彲涓嬭浇2016骞�1鏈�1鏃ュ紑濮嬬殑鏃ヨ处鍗曘�備笉鏀寔涓嬭浇褰撴棩璐﹀崟锛屽彧鑳戒笅杞藉墠涓�鏃�24鐐瑰墠鐨勮处鍗曟暟鎹紙T+1锛夛紝褰撴棩鏁版嵁涓�鑸簬娆℃棩 9 鐐瑰墠鐢熸垚锛岀壒娈婃儏鍐靛彲鑳藉欢杩熴�� + /// * 鏈堣处鍗曟牸寮忎负yyyy-MM锛屾渶鏃╁彲涓嬭浇2016骞�1鏈堝紑濮嬬殑鏈堣处鍗曘�備笉鏀寔涓嬭浇褰撴湀璐﹀崟锛屽彧鑳戒笅杞戒笂涓�鏈堣处鍗曟暟鎹紝褰撴湀璐﹀崟涓�鑸湪娆℃湀 3 鏃ョ敓鎴愶紝鐗规畩鎯呭喌鍙兘寤惰繜銆� + /// * 褰揵iz_type涓簊ettlementMerge鏃跺�欙紝鏃堕棿涓烘眹鎬绘壒娆$粨绠楄祫閲戝埌璐︾殑鏃ユ湡锛屾棩鏈熸牸寮忎负yyyy-MM-dd锛屾渶鏃╁彲涓嬭浇2023骞�4鏈�17鏃ュ強浠ュ悗鐨勮处鍗曘�� + /// </summary> + [JsonProperty("bill_date", NullValueHandling = NullValueHandling.Ignore)] + [Required] + public string BillDate + { + get; + set; + } + + /// <summary> + /// 浜岀骇鍟嗘埛smid锛岃繖涓弬鏁板彧鍦╞ill_type鏄痶rade_zft_merchant鏃舵墠鑳戒娇鐢� + /// </summary> + [JsonProperty("smid", NullValueHandling = NullValueHandling.Ignore)] + public string Smid + { + get; + set; + } + } + + public class DataDataserviceBillDownloadUrlQueryResponse : AlipayBaseOutput + { + /// <summary> + /// 璐﹀崟涓嬭浇鍦板潃閾炬帴锛岃幏鍙栬繛鎺ュ悗30绉掑悗鏈笅杞斤紝閾炬帴鍦板潃澶辨晥銆� + /// </summary> + [JsonProperty("bill_download_url", NullValueHandling = NullValueHandling.Ignore)] + public string BillDownloadUrl + { + get; + set; + } + } +} diff --git a/LifePayment/LifePayment.Domain.Shared/AlipayModel/FundAccountBookQueryInput.cs b/LifePayment/LifePayment.Domain.Shared/AlipayModel/FundAccountBookQueryInput.cs new file mode 100644 index 0000000..7d39bdb --- /dev/null +++ b/LifePayment/LifePayment.Domain.Shared/AlipayModel/FundAccountBookQueryInput.cs @@ -0,0 +1,47 @@ +锘縰sing Newtonsoft.Json; + +namespace LifePayment.Domain +{ + public class FundAccountBookQueryInput + { + /// <summary> + /// 鍟嗘埛浼氬憳鐨勫敮涓�鏍囪瘑锛屽鏋滀紶鍏ccount_book_id姝ゅ瓧娈靛繀浼犲苟姣斿涓�鑷存�с�� + /// </summary> + [JsonProperty("merchant_user_id", NullValueHandling = NullValueHandling.Ignore)] + public string MerchantUserId + { + get; + set; + } + + /// <summary> + /// 璧勯噾璁拌处鏈殑寮�閫氬満鏅爜 :SATF_FUND_BOOK + /// </summary> + [JsonProperty("scene_code", NullValueHandling = NullValueHandling.Ignore)] + public string SceneCode + { + get; + set; + } + + /// <summary> + /// 璁拌处璐︾翱id + /// </summary> + [JsonProperty("account_book_id", NullValueHandling = NullValueHandling.Ignore)] + public string AccountBookId + { + get; + set; + } + + /// <summary> + /// JSON鏍煎紡锛屼紶閫掍笟鍔℃墿灞曞弬鏁� :{"agreement_no":"2019000000000"} + /// </summary> + [JsonProperty("ext_info", NullValueHandling = NullValueHandling.Ignore)] + public string ExtInfo + { + get; + set; + } + } +} diff --git a/LifePayment/LifePayment.Domain.Shared/AlipayModel/FundAccountBookQueryResponse.cs b/LifePayment/LifePayment.Domain.Shared/AlipayModel/FundAccountBookQueryResponse.cs new file mode 100644 index 0000000..fa6986d --- /dev/null +++ b/LifePayment/LifePayment.Domain.Shared/AlipayModel/FundAccountBookQueryResponse.cs @@ -0,0 +1,139 @@ +锘縰sing Newtonsoft.Json; +using System.Runtime.Serialization; +using Tea; + +namespace LifePayment.Domain +{ + public class FundAccountBookQueryResponse : AlipayBaseOutput + { + /// <summary> + /// 鍙敤浣欓 + /// </summary> + [NameInMap("available_amount")] + public string AvaliableAmount + { + get; + set; + } + + /// <summary> + /// 鍦烘櫙浣欓妯″紡澶栨爣鍗′俊鎭� + /// </summary> + [NameInMap("ext_card_info")] + public ExtCardInfo ExtCardInfo + { + get; + set; + } + + /// <summary> + /// 璧勯噾璁拌处鏈叧鑱旂殑鎺堟潈淇℃伅 + /// </summary> + [NameInMap("auth_info")] + public AuthInfoDTO AuthInfo + { + get; + set; + } + + /// <summary> + /// 璁拌处璐︾翱id + /// </summary> + [NameInMap("account_book_id")] + public string AccountBookId + { + get; + set; + } + } + + public class ExtCardInfo: TeaModel + { + /// <summary> + /// 鎵樼瀛愭埛鐨勫鍗″崱鍙� + /// </summary> + [NameInMap("card_no")] + public string CardNo + { + get; + set; + } + + /// <summary> + /// 璁拌处鐨勫鍗$姸鎬�, A锛氭甯哥姸鎬�; 鍏朵粬锛氬紓甯� + /// </summary> + [NameInMap("status")] + public string Status + { + get; + set; + } + + /// <summary> + /// 璁拌处鐨勫鍗℃埛鍚� + /// </summary> + [NameInMap("bank_acc_name")] + public string BankAccName + { + get; + set; + } + + /// <summary> + /// 鎵樼瀛愭埛澶栧崱鏀 + /// </summary> + [NameInMap("card_branch")] + public string CardBranch + { + get; + set; + } + + /// <summary> + /// 鎵樼瀛愭埛澶栧崱寮�鎴疯 + /// </summary> + [NameInMap("card_bank")] + public string CardBank + { + get; + set; + } + + /// <summary> + /// 鎵樼瀛愭埛澶栧崱寮�鎴峰湴鍧� + /// </summary> + [NameInMap("card_location")] + public string CardLocation + { + get; + set; + } + + /// <summary> + /// 鎵樼瀛愭埛澶栧崱鑱旇鍙� + /// </summary> + [NameInMap("card_deposit")] + public string CardDeposit + { + get; + set; + } + } + + public class AuthInfoDTO: TeaModel + { + /// <summary> + /// 鎺堟潈鍗忚鍙� + /// </summary> + /// <value>鎺堟潈鍗忚鍙�</value> + [NameInMap("agreement_no")] + public string AgreementNo { get; set; } + + /// <summary> + /// 鎺堟潈鐨勬敮浠樺疂璐﹀彿锛岃劚鏁忋�� + /// </summary> + /// <value>鎺堟潈鐨勬敮浠樺疂璐﹀彿锛岃劚鏁忋��</value> + [NameInMap("alipay_logon_id")] + public string AlipayLogonId { get; set; } + } +} diff --git a/LifePayment/LifePayment.Domain.Shared/AlipayModel/FundAccountQueryInput.cs b/LifePayment/LifePayment.Domain.Shared/AlipayModel/FundAccountQueryInput.cs new file mode 100644 index 0000000..c16420e --- /dev/null +++ b/LifePayment/LifePayment.Domain.Shared/AlipayModel/FundAccountQueryInput.cs @@ -0,0 +1,29 @@ +锘縰sing Newtonsoft.Json; +using System.ComponentModel.DataAnnotations; + +namespace LifePayment.Domain +{ + public class FundAccountQueryInput + { + /// <summary> + /// 铓傝殎缁熶竴浼氬憳ID + /// </summary> + [JsonProperty("alipay_user_id", NullValueHandling = NullValueHandling.Ignore)] + [Required] + public string AlipayUserId + { + set; + get; + } + + /// <summary> + /// 鏌ヨ鐨勮处鍙风被鍨嬶紝鏌ヨ浣欓璐︽埛鍊间负ACCTRANS_ACCOUNT銆傚繀濉�� + /// </summary> + [JsonProperty("account_type", NullValueHandling = NullValueHandling.Ignore)] + public string AccountType + { + set; + get; + } + } +} diff --git a/LifePayment/LifePayment.Domain.Shared/AlipayModel/FundAccountQueryResponse.cs b/LifePayment/LifePayment.Domain.Shared/AlipayModel/FundAccountQueryResponse.cs new file mode 100644 index 0000000..981b324 --- /dev/null +++ b/LifePayment/LifePayment.Domain.Shared/AlipayModel/FundAccountQueryResponse.cs @@ -0,0 +1,19 @@ +锘縰sing Newtonsoft.Json; +using System.ComponentModel.DataAnnotations; +using Tea; + +namespace LifePayment.Domain +{ + public class FundAccountQueryResponse : AlipayBaseOutput + { + /// <summary> + /// 鍙敤浣欓銆傚彲鐢ㄤ簬鏀粯鎴栨彁鐜扮殑浣欓銆� + /// </summary> + [NameInMap("available_amount")] + public string AvailableAmount + { + set; + get; + } + } +} diff --git a/LifePayment/LifePayment.Domain.Shared/AlipayModel/FundAccountbookCreateInput.cs b/LifePayment/LifePayment.Domain.Shared/AlipayModel/FundAccountbookCreateInput.cs new file mode 100644 index 0000000..fa00098 --- /dev/null +++ b/LifePayment/LifePayment.Domain.Shared/AlipayModel/FundAccountbookCreateInput.cs @@ -0,0 +1,57 @@ +锘縰sing Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace LifePayment.Domain +{ + public class FundAccountbookCreateInput + { + /// <summary> + /// 澶栭儴鍟嗘埛绯荤粺浼氬憳鐨勫敮涓�鏍囪瘑锛岃嚜瀹氫箟浼犲叆 + /// </summary> + [JsonProperty("merchant_user_id", NullValueHandling = NullValueHandling.Ignore)] + [Required] + public string MerchantUserId + { + get; + set; + } + + /// <summary> + /// 澶栭儴鍟嗘埛鐢ㄦ埛绫诲瀷:BUSINESS_EMPLOYEE + /// </summary> + [JsonProperty("merchant_user_type", NullValueHandling = NullValueHandling.Ignore)] + [Required] + public string MerchantUserType + { + get; + set; + } + + /// <summary> + /// 璧勯噾璁拌处鏈殑涓氬姟鍦烘櫙 + /// </summary> + [JsonProperty("scene_code", NullValueHandling = NullValueHandling.Ignore)] + [Required] + public string SceneCode + { + get; + set; + } + + /// <summary> + /// JSON鏍煎紡锛屼紶閫掍笟鍔℃墿灞曞弬鏁� + /// </summary> + [JsonProperty("ext_info", NullValueHandling = NullValueHandling.Ignore)] + [Required] + public string ExtInfo + { + get; + set; + } + } +} diff --git a/LifePayment/LifePayment.Domain.Shared/AlipayModel/FundAccountbookCreateResponse.cs b/LifePayment/LifePayment.Domain.Shared/AlipayModel/FundAccountbookCreateResponse.cs new file mode 100644 index 0000000..23f93b6 --- /dev/null +++ b/LifePayment/LifePayment.Domain.Shared/AlipayModel/FundAccountbookCreateResponse.cs @@ -0,0 +1,50 @@ +锘縰sing Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Tea; + +namespace LifePayment.Domain +{ + public class FundAccountbookCreateResponse : AlipayBaseOutput + { + /// <summary> + /// 寮�閫氱殑璧勯噾璁拌处鏈琲d + /// </summary> + [NameInMap("account_book_id")] + + public string AccountBookId + { + get; + set; + } + + /// <summary> + /// 缃戦摱鍏ラ噾鐨勫鏍囧崱淇℃伅 + /// </summary> + [NameInMap("ext_card_info")] + + public ExtCardInfo ExtCardInfo + { + get; + set; + } + } + + public class FundAccountbookCreateOutput + { + /// <summary> + /// 缃戦摱鍏ラ噾鐨勫鏍囧崱淇℃伅 + /// </summary> + [NameInMap("alipay_fund_accountbook_create_response")] + + public FundAccountbookCreateResponse FundAccountbookCreateResponse + { + get; + set; + } + } +} diff --git a/LifePayment/LifePayment.Domain.Shared/AlipayModel/FundBatchDetailQueryInput.cs b/LifePayment/LifePayment.Domain.Shared/AlipayModel/FundBatchDetailQueryInput.cs new file mode 100644 index 0000000..ee676a1 --- /dev/null +++ b/LifePayment/LifePayment.Domain.Shared/AlipayModel/FundBatchDetailQueryInput.cs @@ -0,0 +1,157 @@ +锘縰sing Newtonsoft.Json; +using System.ComponentModel.DataAnnotations; + +namespace LifePayment.Domain +{ + public class FundBatchDetailQueryInput + { + + /// <summary> + /// 11锝�32浣嶇殑鏁板瓧鎴栧瓧姣嶆垨鏁板瓧涓庡瓧姣嶇殑缁勫悎锛屼笖鍖哄垎澶у皬鍐欍�傦紙娉細鍙湁澧冨浠e彂浣跨敤锛屽叾浠栧満鏅浣跨敤out_batch_no锛� + /// </summary> + [JsonProperty("batch_no", NullValueHandling = NullValueHandling.Ignore)] + [Required] + public string BatchNo + { + set; + get; + } + + /// <summary> + /// 鎵归噺浠e彂鍒版敮浠樺疂璐︽埛锛欱ATCH_TRANS_ACC鎵归噺浠e彂鍒伴摱琛岃处鎴凤細BATCH_TRANS_BC 锛堟敞锛氬彧鏈夊澶栦唬鍙戜娇鐢紝鍏朵粬鍦烘櫙璇蜂娇鐢╬roduct_code锛� + /// </summary> + [JsonProperty("biz_code", NullValueHandling = NullValueHandling.Ignore)] + [Required] + public string BizCode + { + set; + get; + } + + /// <summary> + /// 鎵归噺浠e彂涓氬姟鍦烘櫙銆傚锛� + /// GLOBAL: 鍏ㄧ悆浠e彂.闄NY鐨勫甯佺浠e彂鎴栦汉姘戝竵璺ㄥ浠e彂銆� + /// LOCAL锛氫腑鍥藉鍐呯函浜烘皯甯佷唬鍙戙�� + /// MESSAGE_BATCH_PAY锛氭帴鍙f姤鏂囦唬鍙戙�� + /// </summary> + [JsonProperty("biz_scene", NullValueHandling = NullValueHandling.Ignore)] + [Required] + public string BizScene + { + set; + get; + } + + /// <summary> + /// 绛剧害涓讳綋锛屽嵆绛剧害浜嗘壒閲忎唬鍙戜骇鍝佺殑鏀粯瀹濊处鍙枫�� + /// 娉細澧冨浠e彂鍦烘櫙涓嬪繀椤讳紶鍏� + /// </summary> + [JsonProperty("sign_principal", NullValueHandling = NullValueHandling.Ignore)] + [Required] + public string SignPrincipal + { + set; + get; + } + + /// <summary> + /// 鎵规鏂囦欢涓槑缁嗘祦姘村彿锛堟敞锛氬彧鏈夊澶栦唬鍙戜娇鐢紝鍏朵粬鍦烘櫙璇蜂娇鐢╫ut_biz_no锛� + /// </summary> + [JsonProperty("detail_no", NullValueHandling = NullValueHandling.Ignore)] + [Required] + public string DetailNo + { + set; + get; + } + + /// <summary> + /// 澧冨浠e彂鏄庣粏鐘舵�侊細 + /// INIT锛氭敮浠樺疂鍙涓婁紶鐨勬枃浠跺仛浜嗚褰曪紝杩樻病鏈夊鐞嗐�� + /// APPLIED锛氭敮浠樺疂宸插畬鎴愬厬鎹紝绛夊緟鍙戣捣浠樻眹銆� + /// DEALED锛氬凡鍙戣捣浠樻眹鐢宠锛岀瓑寰呬粯姹囩粨鏋溿�� + /// SUCCESS 澶勭悊鎴愬姛锛氫粯姹囨垚鍔熴�� + /// FAIL 澶勭悊澶辫触锛氭槑缁嗕俊鎭敊璇鑷存槑缁嗘牎楠屽け璐ユ垨鑰呬粯姹囧け璐ャ�� + /// DISUSE 宸插簾寮冿細鏄庣粏琚敮浠樺疂绯荤粺搴熷純銆� + /// 鍏朵粬鍦烘櫙鏄庣粏鐘舵�侊細 + /// SUCCESS锛氭垚鍔� + /// FAIL:澶辫触 + /// DEALING锛氬鐞嗕腑 + /// WAIT_PAY锛氱瓑寰呬粯娆� + /// </summary> + [JsonProperty("detail_status", NullValueHandling = NullValueHandling.Ignore)] + [Required] + public string DetailStatus + { + set; + get; + } + + /// <summary> + /// 鏀舵鏂硅处鍙枫�傚浜庢壒閲忎唬鍙戝埌鏀粯瀹濊处鎴峰満鏅紝濉啓閽卞寘璐﹀彿銆傚浜庢壒閲忎唬鍙戝埌閾惰璐︽埛鍦烘櫙锛屽~鍐欓摱琛屽崱鍙枫�� + /// </summary> + [JsonProperty("payee_account", NullValueHandling = NullValueHandling.Ignore)] + [Required] + public string PayeeAccount + { + set; + get; + } + + /// <summary> + /// 閲囩敤鍒嗛〉鏌ヨ锛屾湰鍙傛暟涓虹┖鎴�0榛樿鏄剧ず绗竴椤点�傦紙澧冨浠e彂鍦烘櫙涓嬶紝姣忛〉鏈�澶�500鏉¤褰曪紝涓嶈冻500鏉″垯鎸夊疄闄呰褰曟暟杩斿洖锛屼笉闇�瑕佸晢鎴疯緭鍏ユ瘡椤电殑璁板綍鏁般�傚鏋滆緭鍏ョ殑鍊煎ぇ浜庢�婚〉鏁帮紝鍒欐敮浠樺疂杩斿洖鏈�鍚庝竴椤垫暟鎹�� + /// 渚嬪锛氭寜鏉′欢鏌ヨ鍒�600鏉℃暟鎹紝鍒欏垎鎴�2椤垫樉绀恒�傝緭鍏�2鎴栧ぇ浜�2鐨勬暣鏁伴兘浼氳繑鍥�100鏉℃暟鎹紱涓嶈緭鍏ヤ换浣曟暟鎹垯榛樿杩斿洖绗竴椤碉紝鍏朵粬鍦烘櫙涓嬶紝姣忛〉澶у皬璇疯緭鍏age_sign瀛楁锛夈�� + /// </summary> + [JsonProperty("page_num", NullValueHandling = NullValueHandling.Ignore)] + [Required] + public string PageNum + { + set; + get; + } + + /// <summary> + /// 涓氬姟浜у搧鐮併�備笉鍚屼骇鍝佸�间笉鍚岋紝鍏蜂綋鍊艰仈绯绘敮浠樺疂纭銆� + /// </summary> + [JsonProperty("product_code", NullValueHandling = NullValueHandling.Ignore)] + [Required] + public string ProductCode + { + set; + get; + } + + /// <summary> + /// 鍟嗘埛鐨勬壒娆″彿 + /// </summary> + [JsonProperty("out_batch_no", NullValueHandling = NullValueHandling.Ignore)] + [Required] + public string OutBatchNo + { + set; + get; + } + + /// <summary> + /// 鍟嗘埛鏄庣粏璁㈠崟鍙� + /// </summary> + [JsonProperty("out_biz_no", NullValueHandling = NullValueHandling.Ignore)] + [Required] + public string OutBizNo + { + set; + get; + } + + /// <summary> + /// 姣忛〉澶у皬锛屼笉浼犵殑鎯呭喌涓嬮粯璁�500鏉★紝瓒呰繃500鏉¢粯璁ゆ寜500鏉℃煡璇紱涓嶈冻500鏉″垯鎸夊疄闄呰褰曟暟杩斿洖 + /// </summary> + [JsonProperty("page_size", NullValueHandling = NullValueHandling.Ignore)] + [Required] + public string PageSize + { + set; + get; + } + } +} diff --git a/LifePayment/LifePayment.Domain.Shared/AlipayModel/FundBatchDetailQueryResponse.cs b/LifePayment/LifePayment.Domain.Shared/AlipayModel/FundBatchDetailQueryResponse.cs new file mode 100644 index 0000000..a669a0b --- /dev/null +++ b/LifePayment/LifePayment.Domain.Shared/AlipayModel/FundBatchDetailQueryResponse.cs @@ -0,0 +1,539 @@ +锘縰sing Newtonsoft.Json; +using System.Collections.Generic; +using Tea; + +namespace LifePayment.Domain +{ + public class FundBatchDetailQueryResponse : AlipayBaseOutput + { + /// <summary> + /// 鏀粯瀹濈郴缁熷唴閮ㄦ壒娆¤姹俰d銆� + /// </summary> + [NameInMap("batch_trans_id")] + public string BatchTransId + { + set; + get; + } + + /// <summary> + /// 鍟嗘埛璇锋眰鐨勬壒娆℃祦姘村彿锛屽悓璇锋眰涓殑"batch_no"銆傦紙娉細鍙湁澧冨浠e彂浣跨敤锛屽叾浠栧満鏅繑鍥瀘ut_batch_no锛� + /// </summary> + [NameInMap("batch_no")] + public string BatchNo + { + set; + get; + } + + /// <summary> + /// 鎵归噺浠e彂涓氬姟鏍囪瘑銆� + /// 鎵归噺浠e彂鍒版敮浠樺疂璐︽埛锛欱ATCH_TRANS_ACC + /// 鎵归噺浠e彂鍒伴摱琛岃处鎴凤細BATCH_TRANS_BC + ///锛堟敞锛氬彧鏈夊澶栦唬鍙戜娇鐢紝鍏朵粬鍦烘櫙杩斿洖product_code锛� + /// </summary> + [NameInMap("biz_code")] + public string BizCode + { + set; + get; + } + /// <summary> + /// 鎵归噺浠e彂涓氬姟鍦烘櫙銆� + /// 濡傦細GLOBAL锛氬叏鐞冧唬鍙戯紝澶氬竵绉嶄唬鍙戯紙鍖呮嫭闄や汉姘戝竵浠ュ鐨勫悓甯佺浠e彂锛夛紝闇�瑕佹敮浠樺疂鍋氳揣甯佸厬鎹€�� + /// LOCAL锛氱函浜烘皯甯佷唬鍙戯紝涓嶉渶瑕佹敮浠樺疂鍋氳揣甯佸厬鎹€�� + /// MESSAGE_BATCH_PAY锛氭帴鍙f姤鏂囦唬鍙戙�� + /// </summary> + [NameInMap("biz_scene")] + public string BizScene + { + set; + get; + } + + /// <summary> + /// 澧冨鍦烘櫙鎵规鐘舵�侊細 + /// INIT 鎵规宸叉帴鏀� + /// WAIT_APPLY 鎵规璧勯噾鍑嗗涓� + /// DEALING 鎵规澶勭悊涓� + /// FINISH 鎵规澶勭悊瀹屾垚 + /// FAIL 鍏ㄩ儴澶勭悊澶辫触 + /// UNKNOWN 鏈煡鐘舵�� + /// 鍏朵粬鍦烘櫙鎵规鐘舵�侊細 + /// INIT 鎵规宸叉帴鏀� + /// WAIT_PAY 绛夊緟鏀粯 + /// DEALING 鎵规澶勭悊涓� + /// SUCCESS 鎵规澶勭悊鍏ㄩ儴鎴愬姛 + /// PART_SUCCESS 鎵规澶勭悊閮ㄥ垎鎴愬姛 + /// FAIL 鍏ㄩ儴澶勭悊澶辫触 + /// DISUSE 鎵规鍗曟嵁搴熷純 + /// INVALID 鎵规鍗曟嵁涓槑缁嗗叏閮ㄦ棤鏁� + /// </summary> + [NameInMap("batch_status")] + public string BatchStatus + { + set; + get; + } + + /// <summary> + /// 鎵规澶辫触閿欒鐮�. + /// 澶ч儴鍒嗘儏鍐垫槸娌℃湁鐨�.鍙湁浣欓涓嶈冻瓒呮椂鍏抽棴鎴栬�呬粯娆炬柟璐︽埛鐘舵�佷笉姝e父 + /// </summary> + [NameInMap("error_code")] + public string ErrorCode + { + set; + get; + } + + /// <summary> + /// 鎵规澶辫触閿欒鍘熷洜 + /// </summary> + [NameInMap("fail_reason")] + public string FailReason + { + set; + get; + } + + /// <summary> + /// 绛剧害浜嗘壒閲忎唬鍙戜骇鍝佺殑鏀粯瀹濊处鍙枫�傦紙娉細澧冨浠e彂鍦烘櫙鍔犱細杩斿洖锛� + /// </summary> + [NameInMap("sign_principal")] + public string SignPrincipal + { + set; + get; + } + + /// <summary> + /// 浠樻鏂归渶瑕佹敮浠樼殑閲戦锛屽彈鐞嗘垚鍔燂紙status涓篈PPLIED锛変箣鍚庢墠浼氭湁鍊硷紝鍙楃悊鎴愬姛涔嬪墠鏄�0銆� + /// </summary> + [NameInMap("payment_amount")] + public string PaymentAmount + { + set; + get; + } + + /// <summary> + /// 鏀粯甯佺, 涓庝唬鍙戣姹傜殑payment_currency鐩稿悓. + /// </summary> + [NameInMap("payment_currency")] + public string PaymentCurrency + { + set; + get; + } + + /// <summary> + /// 褰撳墠璁板綍鏁帮紙榛樿500锛岃揪涓嶅埌500鎸夊疄闄呰褰曡繑鍥烇級銆� + /// </summary> + [NameInMap("page_size")] + public string PageSize + { + set; + get; + } + + /// <summary> + /// 褰撳墠椤垫暟 + /// </summary> + [NameInMap("page_num")] + public string PageNum + { + set; + get; + } + + /// <summary> + /// 涓氬姟浜у搧鐮併�備笉鍚屼骇鍝佸�间笉鍚岋紝鍏蜂綋鍊艰仈绯绘敮浠樺疂纭銆� + /// </summary> + [NameInMap("product_code")] + public string ProductCode + { + set; + get; + } + + /// <summary> + /// 鎬婚〉鏁� + /// </summary> + [NameInMap("total_page_count")] + public string TotalPageCount + { + set; + get; + } + + /// <summary> + /// 鍟嗘埛鐨勬壒娆″彿 + /// </summary> + [NameInMap("out_batch_no")] + public string OutBatchNo + { + set; + get; + } + + /// <summary> + /// 鎵规澶勭悊瀹屾垚鏃堕棿 + /// </summary> + [NameInMap("gmt_finish")] + public string GmtFinish + { + set; + get; + } + + /// <summary> + /// 鎵规鎬婚噾棰� + /// </summary> + [NameInMap("total_amount")] + public string TotalAmount + { + set; + get; + } + + /// <summary> + /// 鎵规鏀粯瀹屾垚鏃堕棿 + /// </summary> + [NameInMap("gmt_pay_finish")] + public string GmtPayFinish + { + set; + get; + } + + /// <summary> + /// 浠樻鏂硅韩浠芥爣璇� + /// </summary> + [NameInMap("payer_id")] + public string PayerId + { + set; + get; + } + + /// <summary> + /// 鎴愬姛閲戦 + /// </summary> + [NameInMap("success_amount")] + public string SuccessAmount + { + set; + get; + } + + /// <summary> + /// 澶辫触閲戦 + /// </summary> + [NameInMap("fail_amount")] + public string FailAmount + { + set; + get; + } + + + /// <summary> + /// 澶辫触绗旀暟 + /// </summary> + [NameInMap("fail_count")] + public string FailCount + { + set; + get; + } + + /// <summary> + /// 鎴愬姛绗旀暟 + /// </summary> + [NameInMap("success_count")] + public string SuccessCount + { + set; + get; + } + + /// <summary> + /// 鎬昏褰曟暟 + /// </summary> + [NameInMap("total_item_count")] + public string TotalItemCount + { + set; + get; + } + /// <summary> + /// 1锛夊綋鎵规鐘舵�佷负INIT鐘舵�佹椂锛屾槑缁嗕俊鎭繕鏈惤鍦帮紝杩斿洖鏄庣粏淇℃伅涓虹┖ + /// 2锛夊鏋滀互涓婇兘娌℃湁闂锛岃繑鍥炴槑缁嗕负绌猴紝璇锋鏌ユ槸鍚︿互涓嬫儏鍐靛鑷达細 + /// 1. 鏍¢獙鍟嗘埛鍙兘鏌ヨ鑷繁涓婁紶鐨勬壒娆′俊鎭紝鎵规鍙蜂笉瀛樺湪鎴栬�呬笉鏄鍟嗘埛涓婁紶鐨勬壒娆°�� + /// 2. 鏌ヨ鏉′欢娌℃湁鏌ヨ鍒扮粨鏋滐紝鍖呮嫭鎬诲叡5椤碉紝鍟嗘埛瑕佹眰鏌ヨ绗�6椤电殑鍐呭銆� + /// 3. 鏌ヨ鐨勭姸鎬佷笉瀛樺湪銆� + /// </summary> + [NameInMap("acc_detail_list")] + public List<AccDetailModel> AccDetailList + { + set; + get; + } + + } + + public class AccDetailModel + { + + /// <summary> + /// 搴斾粯閲戦. 浠樻鏂瑰簲浠橀噾棰�. + /// LOCAL鍦烘櫙涓嬩负绌�. + /// </summary> + [NameInMap("payment_amount")] + public string PaymentAmount + { + set; + get; + } + + /// <summary> + /// 鏀粯甯佺.浠樻鏂瑰簲浠樼殑甯佺, 涓庢壒娆¤姹傛椂鐨刾ayment_currency鐩稿悓. + /// </summary> + [NameInMap("payment_currency")] + public string PaymentCurrency + { + set; + get; + } + + /// <summary> + /// 杞处閲戦銆備唬鍙戣姹備腑鎸囧畾鐨則rans_amount. + /// </summary> + [NameInMap("trans_amount")] + public string TransAmount + { + set; + get; + } + + /// <summary> + /// 杞处甯佺 + /// </summary> + [NameInMap("trans_currency")] + public string TransCurrency + { + set; + get; + } + + /// <summary> + /// 缁撶畻閲戦銆� + /// 鏀舵鏂瑰疄闄呮敹鍒扮殑閲戦. + /// biz_scene鏄疞OCAL鍦烘櫙涓嬶紝璇ュ弬鏁拌繑鍥炵┖銆� + /// </summary> + [NameInMap("settlement_amount")] + public string SettlementAmount + { + set; + get; + } + + /// <summary> + /// 缁撶畻甯佺.鏀舵鏂规敹鍒扮殑甯佺. LOCAL鍦烘櫙涓嬩负绌�. + /// </summary> + [NameInMap("settlement_currency")] + public string SettlementCurrency + { + set; + get; + } + + /// <summary> + /// 鏀舵鏂逛俊鎭�� + /// </summary> + [NameInMap("payee_info")] + public AccPayeeInfo PayeeInfo + { + set; + get; + } + + /// <summary> + /// 鏀舵鏂硅韩浠借璇佷俊鎭�俠iz_scene=LOCAL鏃跺拷鐣ヨ鍙傛暟銆� + /// </summary> + [NameInMap("cert_info")] + public CertInfo CertInfo + { + set; + get; + } + + /// <summary> + /// 澶囨敞 + /// </summary> + [NameInMap("remark")] + public string Remark + { + set; + get; + } + /// <summary> + /// INIT锛氬垵濮� + /// APPLIED锛氬凡涓嬪崟 + /// DEALED锛氬鐞嗕腑 + /// SUCCESS锛氬鐞嗘垚鍔� + /// DISUSE锛氬凡搴熼櫎 + /// FAIL锛氬鐞嗗け璐� + /// UNKNOWN锛氭湭鐭ョ姸鎬� + /// </summary> + [NameInMap("status")] + public string Status + { + set; + get; + } + + + /// <summary> + /// 鏄惁闇�瑕侀�氳繃alipay_order_no鍘熷崟鎹噸璇�. + /// T: 闇�瑕�; + /// F鎴栦负绌�: 涓嶉渶瑕�. + /// </summary> + [NameInMap("need_retry")] + public string NeedRetry + { + set; + get; + } + + /// <summary> + /// 鏀粯瀹濊鍗曞彿 + /// </summary> + [NameInMap("alipay_order_no")] + public string AlipayOrderNo + { + set; + get; + } + + /// <summary> + /// 鍟嗘埛鏄庣粏璁㈠崟鍙� + /// </summary> + [NameInMap("out_biz_no")] + public string OutBizNo + { + set; + get; + } + + /// <summary> + /// 鏀粯瀹濈郴缁熷唴閮ㄦ槑缁嗗崟鍙枫�� + /// </summary> + [NameInMap("detail_id")] + public string DetailId + { + set; + get; + } + + /// <summary> + /// 鏄庣粏澶辫触閿欒鐮� + /// </summary> + [NameInMap("error_code")] + public string ErrorCode + { + set; + get; + } + + /// <summary> + /// 鏄庣粏澶辫触閿欒鍘熷洜 + /// </summary> + [NameInMap("error_msg")] + public string ErrorMsg + { + set; + get; + } + + /// <summary> + /// 鍒涘缓鏃堕棿 + /// </summary> + [NameInMap("gmt_create")] + public string GmtCreate + { + set; + get; + } + + /// <summary> + /// 瀹屾垚鏃堕棿 + /// </summary> + [NameInMap("gmt_finish")] + public string GmtFinish + { + set; + get; + } + + /// <summary> + /// 瀛愮姸鎬� + /// </summary> + [NameInMap("sub_status")] + public string SubStatus + { + set; + get; + } + } + + public class AccPayeeInfo + { + /// <summary> + /// 鏀舵鏂圭數瀛愰挶鍖呰处鍙枫�� + /// </summary> + [NameInMap("payee_account")] + public string PayeeAccount + { + set; + get; + } + + /// <summary> + /// 鏀舵鏂圭數瀛愰挶鍖呮寔鏈夎�呭鍚嶃�� + /// </summary> + [NameInMap("payee_name")] + public string PayeeName + { + set; + get; + } + } + + public class CertInfo + { + /// <summary> + /// 浠e彂鏃跺晢瀹朵笂浼犵殑鏀舵鏂硅瘉浠跺彿鐮� + /// biz_scene=LOCAL鏃跺拷鐣ヨ鍙傛暟銆� + /// </summary> + [NameInMap("cert_no")] + public string CertNo + { + set; + get; + } + + /// <summary> + /// 浠e彂鏃跺晢瀹朵笂浼犵殑鏀舵鏂硅瘉浠剁被鍨嬨�� + /// biz_scene=LOCAL鏃跺拷鐣ヨ鍙傛暟銆� + /// </summary> + [NameInMap("cert_type")] + public string CertType + { + set; + get; + } + } + +} diff --git a/LifePayment/LifePayment.Domain.Shared/AlipayModel/FundBatchOrderChangedContent.cs b/LifePayment/LifePayment.Domain.Shared/AlipayModel/FundBatchOrderChangedContent.cs new file mode 100644 index 0000000..e7efd79 --- /dev/null +++ b/LifePayment/LifePayment.Domain.Shared/AlipayModel/FundBatchOrderChangedContent.cs @@ -0,0 +1,177 @@ +锘縰sing Newtonsoft.Json; + +namespace LifePayment.Domain +{ + public class FundBatchOrderChangedContent + { + /// <summary> + /// 鍟嗘埛鐨勬壒娆″彿 + /// </summary> + [JsonProperty("out_batch_no", NullValueHandling = NullValueHandling.Ignore)] + public string OutBatchNo + { + set; + get; + } + + /// <summary> + /// 涓氬姟浜у搧鐮� + /// </summary> + [JsonProperty("product_code", NullValueHandling = NullValueHandling.Ignore)] + public string ProductCode + { + set; + get; + } + + /// <summary> + /// 涓氬姟鍦烘櫙 + /// </summary> + [JsonProperty("biz_scene", NullValueHandling = NullValueHandling.Ignore)] + public string BizScene + { + set; + get; + } + + /// <summary> + /// 璇锋眰鏉ユ簮鐨勬帴鍙� + /// </summary> + [JsonProperty("origin_interface", NullValueHandling = NullValueHandling.Ignore)] + public string OriginInterface + { + set; + get; + } + + /// <summary> + /// 鏀粯瀹濆唴閮ㄧ殑鎵规ID + /// </summary> + [JsonProperty("batch_trans_id", NullValueHandling = NullValueHandling.Ignore)] + public string BatchTransId + { + set; + get; + } + + /// <summary> + /// 浠樻鏂规敮浠樺疂uid + /// </summary> + [JsonProperty("payer_user_id", NullValueHandling = NullValueHandling.Ignore)] + public string PayerUserId + { + set; + get; + } + + + /// <summary> + /// 鎵规鏄庣粏鎬荤瑪鏁� + /// </summary> + [JsonProperty("total_count", NullValueHandling = NullValueHandling.Ignore)] + public string TotalCount + { + set; + get; + } + + /// <summary> + /// 鎴愬姛绗旀暟 + /// </summary> + [JsonProperty("success_count", NullValueHandling = NullValueHandling.Ignore)] + public string SuccessCount + { + set; + get; + } + + /// <summary> + /// 澶辫触绗旀暟銆� + /// </summary> + [JsonProperty("fail_count", NullValueHandling = NullValueHandling.Ignore)] + public string FailCount + { + set; + get; + } + + /// <summary> + /// 鎵规鐨勬�婚噾棰� + /// </summary> + [JsonProperty("total_amount", NullValueHandling = NullValueHandling.Ignore)] + public string TotalAmount + { + set; + get; + } + + /// <summary> + /// 鏄庣粏澶勭悊鎴愬姛鐨勬敮浠樻眹鎬婚噾棰濄�� + /// </summary> + [JsonProperty("success_amount", NullValueHandling = NullValueHandling.Ignore)] + public string SuccessAmount + { + set; + get; + } + + /// <summary> + /// 鏄庣粏澶勭悊澶辫触鐨勬敮浠樻眹鎬婚噾棰濄�� + /// </summary> + [JsonProperty("fail_amount", NullValueHandling = NullValueHandling.Ignore)] + public string FailAmount + { + set; + get; + } + + /// <summary> + /// 鎵规鐘舵�侊細 + /// NIT 鎵规宸叉帴鏀� + /// WAIT_PAY 绛夊緟鏀粯 + /// DEALING 鎵规澶勭悊涓� + /// SUCCESS 鎵规澶勭悊鍏ㄩ儴鎴愬姛 + /// PART_SUCCESS 鎵规澶勭悊閮ㄥ垎鎴愬姛 + /// FAIL 鍏ㄩ儴澶勭悊澶辫触 + /// DISUSE 鎵规鍗曟嵁搴熷純 + /// INVALID 鎵规鍗曟嵁涓槑缁嗗叏閮ㄦ棤鏁� + /// </summary> + [JsonProperty("batch_status", NullValueHandling = NullValueHandling.Ignore)] + public string BatchStatus + { + set; + get; + } + + /// <summary> + /// 鍟嗘埛鍥炰紶鍙傛暟 + /// </summary> + [JsonProperty("passback_params", NullValueHandling = NullValueHandling.Ignore)] + public string PassbackParams + { + set; + get; + } + + /// <summary> + /// 鎵规澶辫触閿欒鐮�. 澶ч儴鍒嗘儏鍐垫槸娌℃湁鐨�. 鍙湁瓒呮椂鍏抽棴鎴栧簾寮冦�佷粯娆炬柟璐︽埛鐘舵�佷笉姝e父绛夋墠鏈夛紝鍏蜂綋鍊艰仈绯绘敮浠樺疂纭 + /// </summary> + [JsonProperty("error_code", NullValueHandling = NullValueHandling.Ignore)] + public string ErrorCode + { + set; + get; + } + /// <summary> + /// 鍏冲崟鎿嶄綔鑰卛d锛屽湪鐗规畩鍏冲崟鍦烘櫙锛堜緥濡傜敤鎴烽�氳繃鎺ュ彛涓嬪崟锛岃�屽幓鏀粯瀹濈珯鍐呭钩鍙拌繘琛屼富鍔ㄥ叧鍗曪級涓嬫墠鏈夎杩斿洖鍊硷紝骞朵笖涓嶅悓鍦烘櫙鍊间笉鍚岋紝鍏蜂綋鍊艰仈绯绘敮浠樺疂纭銆� + /// </summary> + [JsonProperty("disuse_op_uid", NullValueHandling = NullValueHandling.Ignore)] + public string DisuseOpUid + { + set; + get; + } + + + } +} diff --git a/LifePayment/LifePayment.Domain.Shared/AlipayModel/FundBatchUniTransferInput.cs b/LifePayment/LifePayment.Domain.Shared/AlipayModel/FundBatchUniTransferInput.cs new file mode 100644 index 0000000..4d8613a --- /dev/null +++ b/LifePayment/LifePayment.Domain.Shared/AlipayModel/FundBatchUniTransferInput.cs @@ -0,0 +1,186 @@ +锘縰sing Newtonsoft.Json; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; + +namespace LifePayment.Domain +{ + public class FundBatchUniTransferInput + { + /// <summary> + /// 鍟嗘埛鐨勬壒娆″彿 + /// </summary> + [JsonProperty("out_batch_no", NullValueHandling = NullValueHandling.Ignore)] + [Required] + public string OutBatchNo + { + set; + get; + } + + /// <summary> + /// 閿�鍞骇鍝佺爜锛屽晢瀹跺拰鏀粯瀹濈绾︾殑浜у搧鐮� + /// </summary> + [JsonProperty("product_code", NullValueHandling = NullValueHandling.Ignore)] + [Required] + public string ProductCode + { + set; + get; + } + + + /// <summary> + /// 涓氬姟鍦烘櫙銆備笉鍚屽満鏅�间笉鍚岋紝鍏蜂綋鍊艰仈绯绘敮浠樺疂纭銆� MESSAGE_BATCH_PAY + /// </summary> + [JsonProperty("biz_scene", NullValueHandling = NullValueHandling.Ignore)] + [Required] + public string BizScene + { + set; + get; + } + + /// <summary> + /// 璁㈠崟鎬婚噾棰濓紝鍗曚綅涓哄厓锛岀簿纭埌灏忔暟鐐瑰悗涓や綅锛屽彇鍊艰寖鍥碵0.01,9999999999999.99] + /// </summary> + [JsonProperty("total_trans_amount", NullValueHandling = NullValueHandling.Ignore)] + [Required] + public double TotaltransAmount + { + set; + get; + } + + + /// <summary> + /// 鎵规鎬荤瑪鏁� + /// </summary> + [JsonProperty("total_count", NullValueHandling = NullValueHandling.Ignore)] + [Required] + public string TotalCount + { + set; + get; + } + + /// <summary> + /// 浠樻鏂逛俊鎭� + /// </summary> + [JsonProperty("payer_info", NullValueHandling = NullValueHandling.Ignore)] + [Required] + public Participant PayerInfo + { + set; + get; + } + + /// <summary> + /// 鏀舵淇℃伅鍒楄〃 + /// </summary> + [JsonProperty("trans_order_list", NullValueHandling = NullValueHandling.Ignore)] + [Required] + public List<TransOrderDetail> TransOrderList + { + set; + get; + } + + /// <summary> + /// 杞处澶囨敞 + /// </summary> + [JsonProperty("remark", NullValueHandling = NullValueHandling.Ignore)] + [Required] + public string Remark + { + set; + get; + } + + + + /// <summary> + /// 鏀粯缁濆瓒呮椂鏃堕棿锛屾牸寮忎负yyyy-MM-dd HH:mm + /// </summary> + [JsonProperty("time_expire", NullValueHandling = NullValueHandling.Ignore)] + [Required] + public string TimeExpire + { + set; + get; + } + + + /// <summary> + /// JSON鏍煎紡锛屼紶閫掍笟鍔℃墿灞曞弬鏁帮紝浣跨敤鍓嶈涓庢敮浠樺疂宸ョ▼甯堣仈绯伙紒 {"agreement_no":"2019000000000"} 鎺堟潈鍗忚鍙� + /// </summary> + [JsonProperty("business_params", NullValueHandling = NullValueHandling.Ignore)] + [Required] + public string BusinessParams + { + set; + get; + } + } + + public class TransOrderDetail + { + + /// <summary> + /// 鍟嗘埛璁㈠崟鍙� + /// </summary> + [JsonProperty("out_biz_no", NullValueHandling = NullValueHandling.Ignore)] + [Required] + public string OutBizNo + { + set; + get; + } + + /// <summary> + /// 杞处閲戦 + /// </summary> + [JsonProperty("trans_amount", NullValueHandling = NullValueHandling.Ignore)] + [Required] + public string TransAmount + { + set; + get; + } + + /// <summary> + /// 鏀舵鏂逛俊鎭� + /// </summary> + [JsonProperty("payee_info", NullValueHandling = NullValueHandling.Ignore)] + [Required] + public Participant PayeeInfo + { + set; + get; + } + + /// <summary> + /// 杞处璁㈠崟鐨勬爣棰橈紝鐢ㄤ簬鍦ㄦ敹閾跺彴鍜屾秷璐硅褰曞睍绀� + /// </summary> + [JsonProperty("order_title", NullValueHandling = NullValueHandling.Ignore)] + [Required] + public string OrderTitle + { + set; + get; + } + + /// <summary> + /// 杞处澶囨敞锛屾敹銆佷粯娆炬柟鍧囧彲瑙侊紝鏀舵鏂瑰鏋滄槸鏀粯瀹濊处鍙凤紝浼氬睍绀哄湪鏀舵鏂硅处鍗曢噷銆� + /// </summary> + [JsonProperty("remark", NullValueHandling = NullValueHandling.Ignore)] + [Required] + public string Remark + { + set; + get; + } + } + + + +} diff --git a/LifePayment/LifePayment.Domain.Shared/AlipayModel/FundBatchUniTransferResponse.cs b/LifePayment/LifePayment.Domain.Shared/AlipayModel/FundBatchUniTransferResponse.cs new file mode 100644 index 0000000..8b7c1b9 --- /dev/null +++ b/LifePayment/LifePayment.Domain.Shared/AlipayModel/FundBatchUniTransferResponse.cs @@ -0,0 +1,48 @@ +锘縰sing Newtonsoft.Json; +using Tea; + +namespace LifePayment.Domain +{ + public class FundBatchUniTransferResponse : AlipayBaseOutput + { + /// <summary> + /// 鍟嗘埛鐨勬壒娆″彿 + /// </summary> + [NameInMap("out_batch_no")] + public string OutBatchNo + { + set; + get; + } + + /// <summary> + /// 鏀粯瀹濆唴閮ㄧ殑鎵规ID + /// </summary> + [NameInMap("batch_trans_id")] + public string BatchTransId + { + set; + get; + } + + /// <summary> + /// INIT锛氭壒娆¤惤鍗曟垚鍔� + /// </summary> + [NameInMap("status")] + public string Status + { + set; + get; + } + + /// <summary> + /// 瀹℃壒璁㈠崟閾炬帴 + /// </summary> + [NameInMap("approveOrderUrl")] + public string ApproveOrderUrl + { + set; + get; + } + } +} diff --git a/LifePayment/LifePayment.Domain.Shared/AlipayModel/FundTransCommonQueryInput.cs b/LifePayment/LifePayment.Domain.Shared/AlipayModel/FundTransCommonQueryInput.cs new file mode 100644 index 0000000..be785a5 --- /dev/null +++ b/LifePayment/LifePayment.Domain.Shared/AlipayModel/FundTransCommonQueryInput.cs @@ -0,0 +1,74 @@ +锘縰sing Newtonsoft.Json; +using System.ComponentModel.DataAnnotations; + +namespace LifePayment.Domain +{ + public class FundTransCommonQueryInput + { + /// <summary> + /// 涓氬姟浜у搧鐮併�備笉鍚屼骇鍝佸�间笉鍚岋紝鍏蜂綋鍊艰仈绯绘敮浠樺疂纭銆� + /// </summary> + [JsonProperty("product_code", NullValueHandling = NullValueHandling.Ignore)] + [Required] + public string ProductCode + { + get; + set; + } + + /// <summary> + /// 鎵归噺浠e彂涓氬姟鍦烘櫙銆傚锛� + /// GLOBAL: 鍏ㄧ悆浠e彂.闄NY鐨勫甯佺浠e彂鎴栦汉姘戝竵璺ㄥ浠e彂銆� + /// LOCAL锛氫腑鍥藉鍐呯函浜烘皯甯佷唬鍙戙�� + /// MESSAGE_BATCH_PAY锛氭帴鍙f姤鏂囦唬鍙戙�� + /// </summary> + [JsonProperty("biz_scene", NullValueHandling = NullValueHandling.Ignore)] + public string BizScene + { + get; + set; + } + + /// <summary> + /// 鍟嗘埛杞处鍞竴璁㈠崟鍙凤紝鍙戣捣杞处鏉ユ簮鏂瑰畾涔夌殑杞处鍗曟嵁ID銆� + /// 鏈弬鏁板拰order_id锛堟敮浠樺疂杞处鍗曟嵁鍙凤級銆乸ay_fund_order_id锛堟敮浠樺疂鏀粯璧勯噾娴佹按鍙凤級涓夎�呬笉鑳藉悓鏃朵负绌恒�� + /// 褰撲笁鑰呭悓鏃朵紶鍏ユ椂锛屽皢鐢╬ay_fund_order_id锛堟敮浠樺疂鏀粯璧勯噾娴佹按鍙凤級杩涜鏌ヨ锛屽拷鐣ュ叾浣欎袱鑰咃紱 + /// 褰撴湰鍙傛暟鍜屾敮浠樺疂杞处鍗曟嵁鍙峰悓鏃舵彁渚涙椂锛屽皢鐢ㄦ敮浠樺疂杞处鍗曟嵁鍙疯繘琛屾煡璇紝蹇界暐鏈弬鏁般�� + /// </summary> + [JsonProperty("out_biz_no", NullValueHandling = NullValueHandling.Ignore)] + [Required] + public string OutBizNo + { + get; + set; + } + + /// <summary> + /// 鏀粯瀹濊浆璐﹀崟鎹彿銆� 鏈弬鏁板拰out_biz_no锛堝晢鎴疯浆璐﹀敮涓�璁㈠崟鍙凤級銆乸ay_fund_order_id锛堟敮浠樺疂鏀粯璧勯噾娴佹按鍙凤級涓夎�呬笉鑳藉悓鏃朵负绌恒�� + /// 褰撲笁鑰呭悓鏃朵紶鍏ユ椂锛屽皢鐢╬ay_fund_order_id锛堟敮浠樺疂鏀粯璧勯噾娴佹按鍙凤級杩涜鏌ヨ锛屽拷鐣ュ叾浣欎袱鑰咃紱 + /// 褰撴湰鍙傛暟鍜宲ay_fund_order_id锛堟敮浠樺疂鏀粯璧勯噾娴佹按鍙凤級鍚屾椂鎻愪緵鏃讹紝灏嗙敤鏀粯瀹濇敮浠樿祫閲戞祦姘村彿杩涜鏌ヨ锛屽拷鐣ユ湰鍙傛暟锛� + /// 褰撴湰鍙傛暟鍜宱ut_biz_no锛堝晢鎴疯浆璐﹀敮涓�璁㈠崟鍙凤級鍚屾椂鎻愪緵鏃讹紝灏嗙敤鏈弬鏁拌繘琛屾煡璇紝蹇界暐鍟嗘埛杞处鍞竴璁㈠崟鍙枫�� + /// </summary> + [JsonProperty("order_id", NullValueHandling = NullValueHandling.Ignore)] + [Required] + public string OrderId + { + get; + set; + } + + /// <summary> + /// 鏀粯瀹濇敮浠樿祫閲戞祦姘村彿銆傛湰鍙傛暟鍜屾敮浠樺疂杞处鍗曟嵁鍙枫�佸晢鎴疯浆璐﹀敮涓�璁㈠崟鍙蜂笁鑰呬笉鑳藉悓鏃朵负绌恒�� + /// 褰撴湰鍙傛暟鍜宱ut_biz_no锛堝晢鎴疯浆璐﹀敮涓�璁㈠崟鍙凤級銆乷rder_id锛堟敮浠樺疂杞处鍗曟嵁鍙凤級鍚屾椂鎻愪緵鏃讹紝灏嗙敤鏈弬鏁拌繘琛屾煡璇紝蹇界暐鍏朵綑涓よ�咃紱 + /// 褰撴湰鍙傛暟鍜宱rder_id锛堟敮浠樺疂杞处鍗曟嵁鍙凤級鍚屾椂鎻愪緵鏃讹紝灏嗙敤鏈弬鏁拌繘琛屾煡璇紝蹇界暐鏀粯瀹濊浆璐﹀崟鎹彿锛� + /// 褰撴湰鍙傛暟鍜宱ut_biz_no锛堝晢鎴疯浆璐﹀敮涓�璁㈠崟鍙凤級鍚屾椂鎻愪緵鏃讹紝灏嗙敤鏈弬鏁拌繘琛屾煡璇紝蹇界暐鍟嗘埛杞处鍞竴璁㈠崟鍙枫�� + /// </summary> + [JsonProperty("pay_fund_order_id", NullValueHandling = NullValueHandling.Ignore)] + [Required] + public string PayFundOrderId + { + get; + set; + } + } +} diff --git a/LifePayment/LifePayment.Domain.Shared/AlipayModel/FundTransCommonQueryResponse.cs b/LifePayment/LifePayment.Domain.Shared/AlipayModel/FundTransCommonQueryResponse.cs new file mode 100644 index 0000000..f1a715e --- /dev/null +++ b/LifePayment/LifePayment.Domain.Shared/AlipayModel/FundTransCommonQueryResponse.cs @@ -0,0 +1,179 @@ +锘縰sing Newtonsoft.Json; +using Tea; + +namespace LifePayment.Domain +{ + public class FundTransCommonQueryResponse : AlipayBaseOutput + { + /// <summary> + /// 鏀粯瀹濊浆璐﹀崟鎹彿锛屾煡璇㈠け璐ヤ笉杩斿洖銆� + /// </summary> + [NameInMap("order_id")] + public string OrderId + { + get; + set; + } + + /// <summary> + /// 閲戣瀺鏈烘瀯鍙戣捣绛剧害绫汇�佹敮浠樼被銆佸樊閿欑被涓氬姟鏃讹紝搴斾负姣忕瑪涓氬姟鍒嗛厤鍞竴鐨勪氦鏄撴祦姘村彿銆�31浣嶄氦鏄撴祦姘村彿缁勬垚瑙勫垯涓猴細 + /// 鈥�8浣嶆棩鏈熲��+鈥�16浣嶅簭鍒楀彿鈥�+鈥�1浣嶉鐣欎綅鈥�+鈥�6浣嶆帶鍒朵綅鈥濓紝鍏朵腑锛� a锛夆��8浣嶆棩鏈熲�濅负绯荤粺褰撳墠鏃ユ湡锛孖SODate鏍煎紡锛氣�淵YYYMMDD鈥� b锛� + /// 鈥�16浣嶅簭鍒楀彿鈥濈敱閲戣瀺鏈烘瀯鐢熸垚锛岄噾铻嶆満鏋勫簲纭繚璇ュ�煎湪缃戣仈褰撴棩鍞竴 c锛夆��1浣嶉鐣欎綅鈥濈敱骞冲彴鍒嗛厤 d锛夆��6浣嶆帶鍒朵綅鈥� + /// 鐢遍噾铻嶆満鏋勯�氳繃骞冲彴鑾峰彇 渚嬪锛�2023052993044491260542090100400 + /// </summary> + [NameInMap("inflow_settle_serial_no")] + public string InflowSettleSerialNo + { + get; + set; + } + + /// <summary> + /// 鍟嗘埛璁㈠崟鍙� + /// </summary> + [NameInMap("out_biz_no")] + public string OutBizNo + { + get; + set; + } + + /// <summary> + /// 杞处鍗曟嵁鐘舵�併�傚彲鑳藉嚭鐜扮殑鐘舵�佸涓嬶細 + /// SUCCESS锛氳浆璐︽垚鍔燂紱 + /// WAIT_PAY锛氱瓑寰呮敮浠橈紱 + /// CLOSED锛氳鍗曡秴鏃跺叧闂紱 + /// FAIL锛氬け璐ワ紙閫傜敤浜�"鍗曠瑪杞处鍒伴摱琛屽崱"锛夛紱 + /// DEALING锛氬鐞嗕腑锛堥�傜敤浜�"鍗曠瑪杞处鍒伴摱琛屽崱"锛夛紱 + /// REFUND锛氶��绁紙閫傜敤浜�"鍗曠瑪杞处鍒伴摱琛屽崱"锛夛紱 + /// alipay.fund.trans.app.pay娑夊強鐨勭姸鎬侊細 WAIT_PAY銆丼UCCESS銆丆LOSED + /// alipay.fund.trans.refund娑夊強鐨勭姸鎬侊細SUCCESS + /// alipay.fund.trans.uni.transfer娑夊強鐨勭姸鎬侊細SUCCESS銆丗AIL銆丏EALING銆丷EFUND + /// </summary> + [NameInMap("status")] + public string Status + { + get; + set; + } + + /// <summary> + /// 閲戣瀺鏈烘瀯鍙戣捣绛剧害绫汇�佹敮浠樼被銆佸樊閿欑被涓氬姟鏃讹紝搴斾负姣忕瑪涓氬姟鍒嗛厤鍞竴鐨勪氦鏄撴祦姘村彿銆� + /// 31浣嶄氦鏄撴祦姘村彿缁勬垚瑙勫垯涓猴細鈥�8浣嶆棩鏈熲��+鈥�16浣嶅簭鍒楀彿鈥�+鈥�1浣嶉鐣欎綅鈥�+鈥�6浣嶆帶鍒朵綅鈥濓紝鍏朵腑锛� a锛� + /// 鈥�8浣嶆棩鏈熲�濅负绯荤粺褰撳墠鏃ユ湡锛孖SODate鏍煎紡锛氣�淵YYYMMDD鈥� b锛夆��16浣嶅簭鍒楀彿鈥濈敱閲戣瀺鏈烘瀯鐢熸垚锛岄噾铻嶆満鏋勫簲纭繚璇ュ�煎湪缃戣仈褰撴棩鍞竴 c锛� + /// 鈥�1浣嶉鐣欎綅鈥濈敱骞冲彴鍒嗛厤 d锛夆��6浣嶆帶鍒朵綅鈥濈敱閲戣瀺鏈烘瀯閫氳繃骞冲彴鑾峰彇 渚嬪锛�2023052993044491260542090100400 + /// </summary> + [NameInMap("settle_serial_no")] + public string SettleSerialNo + { + get; + set; + } + + /// <summary> + /// 鏀粯瀹濇敮浠樿祫閲戞祦姘村彿锛岃浆璐﹀け璐ヤ笉杩斿洖銆� + /// </summary> + [NameInMap("pay_fund_order_id")] + public string PayFundOrderId + { + get; + set; + } + + + + /// <summary> + /// 浠樻閲戦锛屾敹閾跺彴鍦烘櫙涓嬩粯娆炬垚鍔熷悗鐨勬敮浠橀噾棰濓紝璁㈠崟鐘舵�佷负SUCCESS鎵嶈繑鍥烇紝鍏朵粬鐘舵�佷笉杩斿洖銆� + /// </summary> + [NameInMap("trans_amount")] + public string TransAmount + { + get; + set; + } + + + + /// <summary> + /// 鏀粯鏃堕棿锛屾牸寮忎负yyyy-MM-dd HH:mm:ss锛岃浆璐﹀け璐ヤ笉杩斿洖銆� + /// </summary> + [NameInMap("pay_date")] + public string PayDate + { + get; + set; + } + + /// <summary> + /// 棰勮鍒拌处鏃堕棿锛岃浆璐﹀埌閾惰鍗′笓鐢紝鏍煎紡涓簓yyy-MM-dd HH:mm:ss锛岃浆璐﹀彈鐞嗗け璐ヤ笉杩斿洖銆� + /// 娉ㄦ剰锛� + /// 姝ゅ弬鏁颁负棰勮鏃堕棿锛屽彲鑳戒笌瀹為檯鍒拌处鏃堕棿鏈夎緝澶ц宸紝涓嶈兘浣滀负瀹為檯鍒拌处鏃堕棿浣跨敤锛屼粎渚涘弬鑰冪敤閫斻�� + /// </summary> + [NameInMap("arrival_time_end")] + public string ArrivalTimeEnd + { + get; + set; + } + + /// <summary> + /// 棰勮鏀惰垂閲戦锛堝厓锛夛紝杞处鍒伴摱琛屽崱涓撶敤锛屾暟瀛楁牸寮忥紝绮剧‘鍒板皬鏁扮偣鍚�2浣嶏紝杞处澶辫触鎴栬浆璐﹀彈鐞嗗け璐ヤ笉杩斿洖銆傚锛�0.02 + /// </summary> + [NameInMap("order_fee")] + public string OrderFee + { + get; + set; + } + + /// <summary> + /// 鏌ヨ鍒扮殑璁㈠崟鐘舵�佷负FAIL澶辫触鎴朢EFUND閫�绁ㄦ椂锛岃繑鍥為敊璇唬鐮� 鍥為敊璇唬鐮� PAYEE_CARD_INFO_ERROR + /// </summary> + [NameInMap("error_code")] + public string ErrorCode + { + get; + set; + } + + /// <summary> + /// 鏌ヨ鍒扮殑璁㈠崟鐘舵�佷负FAIL澶辫触鎴朢EFUND閫�绁ㄦ椂锛岃繑鍥炲叿浣撶殑鍘熷洜銆傚锛氭敹娆炬柟閾惰鍗′俊鎭湁璇� + /// </summary> + [NameInMap("fail_reason")] + public string FailReason + { + get; + set; + } + + /// <summary> + /// 鐗规畩鍦烘櫙鎻愪緵锛屽綋瀛愬崟鍑虹幇寮傚父瀵艰嚧涓诲崟澶辫触鎴栬�呴��娆炬椂锛屼細鎻愪緵姝ゅ瓧娈碉紝鐢ㄤ簬閫忓嚭瀛愬崟鍏蜂綋鐨勯敊璇満鏅� + /// </summary> + [NameInMap("sub_order_error_code")] + public string SubOrderErrorCode + { + get; + set; + } + + /// <summary> + /// 鐗规畩鍦烘櫙鎻愪緵锛屽綋瀛愬崟鍑虹幇寮傚父瀵艰嚧涓诲崟澶辫触鎴栬�呴��娆炬椂锛屼細鎻愪緵姝ゅ瓧娈碉紝鐢ㄤ簬閫忓嚭瀛愬崟鍏蜂綋鐨勯敊璇満鏅� + /// </summary> + [NameInMap("sub_order_fail_reason")] + public string SubOrderFailReason + { + get; + set; + } + + /// <summary> + /// 閫�娆惧瓙鍗曞け璐ョ姸鎬� + /// </summary> + [NameInMap("sub_order_status")] + public string SubOrderStatus + { + get; + set; + } + } +} diff --git a/LifePayment/LifePayment.Domain.Shared/AlipayModel/FundTransOrderChangedContent.cs b/LifePayment/LifePayment.Domain.Shared/AlipayModel/FundTransOrderChangedContent.cs new file mode 100644 index 0000000..931428e --- /dev/null +++ b/LifePayment/LifePayment.Domain.Shared/AlipayModel/FundTransOrderChangedContent.cs @@ -0,0 +1,121 @@ +锘縰sing Newtonsoft.Json; + +namespace LifePayment.Domain +{ + public class FundTransOrderChangedContent + { + /// <summary> + /// 鍟嗘埛鐨勬壒娆″彿 + /// </summary> + [JsonProperty("out_batch_no", NullValueHandling = NullValueHandling.Ignore)] + public string OutBatchNo + { + set; + get; + } + + /// <summary> + /// 涓氬姟浜у搧鐮� + /// </summary> + [JsonProperty("product_code", NullValueHandling = NullValueHandling.Ignore)] + public string ProductCode + { + set; + get; + } + /// <summary> + /// 涓氬姟鍦烘櫙 + /// </summary> + [JsonProperty("biz_scene", NullValueHandling = NullValueHandling.Ignore)] + public string BizScene + { + set; + get; + } + + /// <summary> + /// 璇锋眰鏉ユ簮鐨勬帴鍙� + /// </summary> + [JsonProperty("origin_interface", NullValueHandling = NullValueHandling.Ignore)] + public string OriginInterface + { + set; + get; + } + + /// <summary> + /// 鏀粯瀹濇敮浠樿祫閲戞祦姘村彿锛屼粎褰撹浆璐︽垚鍔熸墠浼氳繑鍥炶鍙傛暟 + /// </summary> + [JsonProperty("pay_fund_order_id", NullValueHandling = NullValueHandling.Ignore)] + public string PayFundOrderId + { + set; + get; + } + + /// <summary> + /// 鏀粯瀹濊浆璐﹀崟鎹彿 + /// </summary> + [JsonProperty("order_id", NullValueHandling = NullValueHandling.Ignore)] + public string OrderId + { + set; + get; + } + + /// <summary> + /// 杞处鍗曟嵁鐘舵�併�傚彲鑳藉嚭鐜扮殑鐘舵�佸涓嬶細 + /// SUCCESS锛氳浆璐︽垚鍔燂紱 + /// WAIT_PAY锛氱瓑寰呮敮浠橈紱 + /// CLOSED锛氳鍗曡秴鏃跺叧闂� + /// alipay.fund.trans.app.pay娑夊強鐨勭姸鎬侊細 WAIT_PAY SUCCESS CLOSED + /// alipay.fund.trans.uni.transfer銆乤lipay.fund.trans.refund娑夊強鐨勭姸鎬侊細SUCCESS + /// </summary> + [JsonProperty("status", NullValueHandling = NullValueHandling.Ignore)] + public string Status + { + set; + get; + } + + /// <summary> + /// 璧勯噾璁㈠崟鐨勬搷浣滅被鍨嬶紝CREATE-鍒涘缓锛汧INISH- 璁㈠崟澶勭悊宸插畬缁� CLOSE-瓒呮椂鍏抽棴 锛� + /// </summary> + [JsonProperty("action_type", NullValueHandling = NullValueHandling.Ignore)] + public string ActionType + { + set; + get; + } + + /// <summary> + /// 杞处閲戦 + /// </summary> + [JsonProperty("trans_amount", NullValueHandling = NullValueHandling.Ignore)] + public string TransAmount + { + set; + get; + } + + /// <summary> + /// 鏀粯瀹屾垚鏃堕棿 + /// </summary> + [JsonProperty("pay_date", NullValueHandling = NullValueHandling.Ignore)] + public string PayDate + { + set; + get; + } + + /// <summary> + /// 鏃犲咖鏀跺満鏅笅鐨勫彈鐞嗗崟鍙� + /// </summary> + [JsonProperty("entrust_order_id", NullValueHandling = NullValueHandling.Ignore)] + public string EntrustOrderId + { + set; + get; + } + } +} diff --git a/LifePayment/LifePayment.Domain.Shared/AlipayModel/FundTransOrderChangedInput.cs b/LifePayment/LifePayment.Domain.Shared/AlipayModel/FundTransOrderChangedInput.cs new file mode 100644 index 0000000..8361b77 --- /dev/null +++ b/LifePayment/LifePayment.Domain.Shared/AlipayModel/FundTransOrderChangedInput.cs @@ -0,0 +1,269 @@ +锘縰sing Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace LifePayment.Domain +{ + public class OrderChangedBzContentInput + { + /// <summary> + /// 鍟嗘埛绔殑鍞竴璁㈠崟鍙� + /// </summary> + [JsonProperty("out_biz_no", NullValueHandling = NullValueHandling.Ignore)] + public string OutBizNo + { + get; + set; + } + + /// <summary> + /// 閿�鍞骇鍝佺爜锛屽晢瀹跺拰鏀粯瀹濈绾︾殑浜у搧鐮併�� STD_RED_PACKET锛氱幇閲戠孩鍖咃紱 TRANS_ACCOUNT_NO_PWD锛氬崟绗旀棤瀵嗚浆璐� + /// </summary> + [JsonProperty("product_code", NullValueHandling = NullValueHandling.Ignore)] + public string ProductCode + { + get; + set; + } + + /// <summary> + /// 鎻忚堪鐗瑰畾鐨勪笟鍔″満鏅紝濡傛灉浼犻�掍簡out_biz_no鍒欒瀛楁涓哄繀浼犮�傚彲鍙栫殑涓氬姟鍦烘櫙濡備笅锛� PERSONAL_PAY锛欳2C鐜伴噾绾㈠寘-鍙戠孩鍖咃紱 PERSONAL_COLLECTION锛欳2C鐜伴噾绾㈠寘-棰嗙孩鍖咃紱 REFUND锛欳2C鐜伴噾绾㈠寘-绾㈠寘閫�鍥烇紱 DIRECT_TRANSFER锛欱2C鐜伴噾绾㈠寘銆佸崟绗旀棤瀵嗚浆璐� + /// </summary> + [JsonProperty("biz_scene", NullValueHandling = NullValueHandling.Ignore)] + public string BizScene + { + get; + set; + } + + /// <summary> + /// 璇锋眰鏉ユ簮鐨勬帴鍙� + /// </summary> + [JsonProperty("origin_interface", NullValueHandling = NullValueHandling.Ignore)] + public string OriginInterface + { + get; + set; + } + + /// <summary> + /// 鏀粯瀹濊浆璐﹀崟鎹彿 + /// </summary> + [JsonProperty("order_id", NullValueHandling = NullValueHandling.Ignore)] + public string OrderId + { + get; + set; + } + + /// <summary> + /// 杞处鍗曟嵁鐘舵�併�傚彲鑳藉嚭鐜扮殑鐘舵�佸涓嬶細 SUCCESS锛氳浆璐︽垚鍔燂紱 WAIT_PAY锛氱瓑寰呮敮浠橈紱 CLOSED锛氳鍗曡秴鏃跺叧闂紱 REFUND锛氶��绁紱 DEALING锛氳浆璐﹀埌閾惰鍗″鐞嗕腑锛� + /// FAIL锛氳浆璐﹀け璐ワ紱 alipay.fund.trans.app.pay娑夊強鐨勭姸鎬侊細 WAIT_PAY SUCCESS CLOSED alipay.fund.trans.uni.transfer銆乤lipay.fund.trans.refund娑夊強鐨勭姸鎬侊細SUCCESS REFUND DEALING FAIL 涓嶅悓鐨勮浆璐︽帴鍙f秹鍙婁笉鍚岀殑鍗曟嵁鐘舵�侊紝浠ュ疄闄呭満鏅负鍑� + /// </summary> + [JsonProperty("status", NullValueHandling = NullValueHandling.Ignore)] + public string Status + { + get; + set; + } + + /// <summary> + /// 璧勯噾璁㈠崟鐨勬搷浣滅被鍨嬶紝 CREATE-鍒涘缓锛� FINISH- 璁㈠崟澶勭悊宸插畬缁� CLOSE-瓒呮椂鍏抽棴 锛� + /// </summary> + [JsonProperty("action_type", NullValueHandling = NullValueHandling.Ignore)] + public string ActionType + { + get; + set; + } + + /// <summary> + /// 杞处閲戦,鍗曚綅鍏� + /// </summary> + [JsonProperty("trans_amount", NullValueHandling = NullValueHandling.Ignore)] + public string TransAmount + { + get; + set; + } + + /// <summary> + /// 閲戣瀺鏈烘瀯鍙戣捣绛剧害绫汇�佹敮浠樼被銆佸樊閿欑被涓氬姟鏃讹紝搴斾负姣忕瑪涓氬姟鍒嗛厤鍞竴鐨勪氦鏄撴祦姘村彿銆�31浣嶄氦鏄撴祦姘村彿缁勬垚瑙勫垯涓猴細 + /// 鈥�8浣嶆棩鏈熲��+鈥�16浣嶅簭鍒楀彿鈥�+鈥�1浣嶉鐣欎綅鈥�+鈥�6浣嶆帶鍒朵綅鈥濓紝鍏朵腑锛� a锛夆��8浣嶆棩鏈熲�濅负绯荤粺褰撳墠鏃ユ湡锛孖SODate鏍煎紡锛氣�淵YYYMMDD鈥� b锛� + /// 鈥�16浣嶅簭鍒楀彿鈥濈敱閲戣瀺鏈烘瀯鐢熸垚锛岄噾铻嶆満鏋勫簲纭繚璇ュ�煎湪缃戣仈褰撴棩鍞竴 c锛夆��1浣嶉鐣欎綅鈥濈敱骞冲彴鍒嗛厤 d锛夆��6浣嶆帶鍒朵綅鈥濈敱閲戣瀺鏈烘瀯閫氳繃骞冲彴鑾峰彇 渚嬪锛�2023052993044491260542090100400 + /// </summary> + [JsonProperty("settle_serial_no", NullValueHandling = NullValueHandling.Ignore)] + public string SettleSerialNo + { + get; + set; + } + + /// <summary> + /// 澶辫触瀛愬崟鍏蜂綋鐘舵�� + /// </summary> + [JsonProperty("sub_order_status", NullValueHandling = NullValueHandling.Ignore)] + public string SubOrderStatus + { + get; + set; + } + + /// <summary> + /// 鐗规畩鍦烘櫙鎻愪緵锛屽綋瀛愬崟鍑虹幇寮傚父瀵艰嚧涓诲崟澶辫触鎴栬�呴��娆炬椂锛屼細鎻愪緵姝ゅ瓧娈碉紝鐢ㄤ簬閫忓嚭瀛愬崟鍏蜂綋鐨勯敊璇満鏅� + /// </summary> + [JsonProperty("sub_order_error_code", NullValueHandling = NullValueHandling.Ignore)] + public string SubOrderErrorCode + { + get; + set; + } + + /// <summary> + /// 鐗规畩鍦烘櫙鎻愪緵锛屽綋瀛愬崟鍑虹幇寮傚父瀵艰嚧涓诲崟澶辫触鎴栬�呴��娆炬椂锛屼細鎻愪緵姝ゅ瓧娈碉紝鐢ㄤ簬閫忓嚭瀛愬崟鍏蜂綋鐨勯敊璇満鏅� + /// </summary> + [JsonProperty("sub_order_fail_reason", NullValueHandling = NullValueHandling.Ignore)] + public string SubOrderFailReason + { + get; + set; + } + + /// <summary> + /// 鏀粯瀹濇敮浠樿祫閲戞祦姘村彿锛屼粎褰撹浆璐︽垚鍔熸墠浼氳繑鍥炶鍙傛暟 + /// </summary> + [JsonProperty("pay_fund_order_id", NullValueHandling = NullValueHandling.Ignore)] + public string PayFundOrderId + { + get; + set; + } + + /// <summary> + /// 鏀粯瀹屾垚鏃堕棿 + /// </summary> + [JsonProperty("pay_date", NullValueHandling = NullValueHandling.Ignore)] + public string PayDate + { + get; + set; + } + + /// <summary> + /// 鑷姩閫�娆炬椂闂� + /// </summary> + [JsonProperty("refund_date", NullValueHandling = NullValueHandling.Ignore)] + public string RefundDate + { + get; + set; + } + + /// <summary> + /// 鏃犲咖鏀跺満鏅笅鐨勫彈鐞嗗崟鍙� + /// </summary> + [JsonProperty("entrust_order_id", NullValueHandling = NullValueHandling.Ignore)] + public string EntrustOrderId + { + get; + set; + } + } + + public class FundOrderChangedInput + { + /// <summary> + /// 閫氱煡ID + /// </summary> + [JsonProperty("notify_id", NullValueHandling = NullValueHandling.Ignore)] + public string NotifyId + { + get; + set; + } + + /// <summary> + /// 娑堟伅鍙戦�佹椂鐨勬湇鍔$鏃堕棿 + /// </summary> + [JsonProperty("utc_timestamp", NullValueHandling = NullValueHandling.Ignore)] + public string UtcTimestamp + { + get; + set; + } + + /// <summary> + /// 娑堟伅鎺ュ彛鍚嶇О + /// </summary> + [JsonProperty("msg_method", NullValueHandling = NullValueHandling.Ignore)] + public string MsgMethod + { + get; + set; + } + + /// <summary> + /// 娑堟伅鎺ュ彈鏂圭殑搴旂敤id + /// </summary> + [JsonProperty("app_id", NullValueHandling = NullValueHandling.Ignore)] + public string AppId + { + get; + set; + } + + /// <summary> + /// 鐗堟湰鍙�(1.1鐗堟湰涓烘爣鍑嗘秷鎭�) + /// </summary> + [JsonProperty("version", NullValueHandling = NullValueHandling.Ignore)] + public string Version + { + get; + set; + } + + /// <summary> + /// 娑堟伅鎶ユ枃 + /// </summary> + [JsonProperty("biz_content", NullValueHandling = NullValueHandling.Ignore)] + public OrderChangedBzContentInput BizContent + { + get; + set; + } + + /// <summary> + /// 绛惧悕 + /// </summary> + [JsonProperty("sign", NullValueHandling = NullValueHandling.Ignore)] + public string Sign + { + get; + set; + } + + /// <summary> + /// 绛惧悕绫诲瀷 + /// </summary> + [JsonProperty("sign_type", NullValueHandling = NullValueHandling.Ignore)] + public string SignType + { + get; + set; + } + + /// <summary> + /// 缂栫爜闆嗭紝璇ュ瓧绗﹂泦涓洪獙绛惧拰瑙e瘑鎵�闇�瑕佺殑瀛楃闆� + /// </summary> + [JsonProperty("charset", NullValueHandling = NullValueHandling.Ignore)] + public string Charset + { + get; + set; + } + } +} diff --git a/LifePayment/LifePayment.Domain.Shared/AlipayModel/FundTransPagePayInput.cs b/LifePayment/LifePayment.Domain.Shared/AlipayModel/FundTransPagePayInput.cs new file mode 100644 index 0000000..8a2a505 --- /dev/null +++ b/LifePayment/LifePayment.Domain.Shared/AlipayModel/FundTransPagePayInput.cs @@ -0,0 +1,291 @@ +锘縰sing Newtonsoft.Json; +using System.ComponentModel.DataAnnotations; + +namespace LifePayment.Domain +{ + public class FundTransPagePayInput + { + /// <summary> + /// 鍟嗘埛绔殑鍞竴璁㈠崟鍙凤紝瀵逛簬鍚屼竴绗旇浆璐﹁姹傦紝鍟嗘埛闇�淇濊瘉璇ヨ鍗曞彿鍞竴銆� + /// </summary> + [JsonProperty("out_biz_no", NullValueHandling = NullValueHandling.Ignore)] + [Required] + public string OutBizNo + { + get; + set; + } + + /// <summary> + /// 璁㈠崟鎬婚噾棰濓紝鍗曚綅涓哄厓锛岀簿纭埌灏忔暟鐐瑰悗涓や綅锛屽彇鍊艰寖鍥碵0.01,9999999999999.99] + /// </summary> + [JsonProperty("trans_amount", NullValueHandling = NullValueHandling.Ignore)] + [Required] + public decimal TransAmount + { + get; + set; + } + + /// <summary> + /// 閿�鍞骇鍝佺爜锛屽晢瀹跺拰鏀粯瀹濈绾︾殑浜у搧鐮� + /// </summary> + [JsonProperty("product_code", NullValueHandling = NullValueHandling.Ignore)] + [Required] + public string ProductCode + { + get; + set; + } + + /// <summary> + /// 鎻忚堪鐗瑰畾鐨勪笟鍔″満鏅紝姣斿瀵瑰厷璐圭即绾冲満鏅渶璧板厷璐逛笓鎴� + /// </summary> + [JsonProperty("biz_scene", NullValueHandling = NullValueHandling.Ignore)] + [Required] + public string BizScene + { + get; + set; + } + + /// <summary> + /// 鏀舵鏂逛俊鎭� + /// </summary> + [JsonProperty("payee_info", NullValueHandling = NullValueHandling.Ignore)] + [Required] + public Participant PayeeInfo + { + get; + set; + } + + /// <summary> + /// 杞处澶囨敞 + /// </summary> + [JsonProperty("remark", NullValueHandling = NullValueHandling.Ignore)] + [Required] + public string Remark + { + get; + set; + } + + /// <summary> + /// 鏀粯瀹濊鍗曞彿锛屼粎鎵归噺鏈夊瘑鍦烘櫙涓嬬敓鏁� + /// </summary> + [JsonProperty("order_id", NullValueHandling = NullValueHandling.Ignore)] + [Required] + public string OrderId + { + get; + set; + } + + /// <summary> + /// 浠樻鏂逛俊鎭� + /// </summary> + [JsonProperty("payer_info", NullValueHandling = NullValueHandling.Ignore)] + [Required] + public Participant PayerInfo + { + get; + set; + } + + /// <summary> + /// 杞处璁㈠崟鐨勬爣棰橈紝鐢ㄤ簬鍦ㄦ敹閾跺彴鍜屾秷璐硅褰曞睍绀� + /// </summary> + [JsonProperty("order_title", NullValueHandling = NullValueHandling.Ignore)] + [Required] + public string OrderTitle + { + get; + set; + } + + /// <summary> + /// 鏀粯缁濆瓒呮椂鏃堕棿锛屾牸寮忎负yyyy-MM-dd HH:mm + /// </summary> + [JsonProperty("time_expire", NullValueHandling = NullValueHandling.Ignore)] + [Required] + public string TimeExpire + { + get; + set; + } + + /// <summary> + /// 鑷姩閫�娆剧粷瀵硅秴鏃舵椂闂达紝鏍煎紡涓簓yyy-MM-dd HH:mm + /// </summary> + [JsonProperty("refund_time_expire", NullValueHandling = NullValueHandling.Ignore)] + [Required] + public string RefundTimeExpire + { + get; + set; + } + + /// <summary> + /// 鍏敤鍥炰紶鍙傛暟锛屽鏋滆姹傛椂浼犻�掍簡璇ュ弬鏁帮紝鍒欏紓姝ラ�氱煡鍟嗘埛鏃朵細鍥炰紶璇ュ弬鏁般�� + /// </summary> + [JsonProperty("passback_params", NullValueHandling = NullValueHandling.Ignore)] + [Required] + public string PassbackParams + { + get; + set; + } + + /// <summary> + /// JSON鏍煎紡锛屼紶閫掍笟鍔℃墿灞曞弬鏁帮紝浣跨敤鍓嶈涓庢敮浠樺疂宸ョ▼甯堣仈绯伙紒 + /// </summary> + [JsonProperty("business_params", NullValueHandling = NullValueHandling.Ignore)] + [Required] + public string BusinessParams + { + get; + set; + } + } + + public class Participant + { + /// <summary> + /// 鏀舵鏂硅处鍙锋垨浠樻鏂硅处鍙凤紝浼犲叆鏀粯瀹漸id 鍙備笌鏂圭殑鏍囪瘑锛屽崟绗旀棤瀵嗚浆璐﹀埌閾惰鍗″浐瀹氫负鏀舵鏂归摱琛屽崱鍙� + /// </summary> + [JsonProperty("identity", NullValueHandling = NullValueHandling.Ignore)] + [Required] + public string Identity + { + get; + set; + } + + /// <summary> + /// identity浼犲叆鏀粯瀹漸id鏃朵负锛歀AIPAY_USER_ID 鍙備笌鏂圭殑鏍囪瘑绫诲瀷锛屽崟绗旀棤瀵嗚浆璐﹀埌閾惰鍗″浐瀹氫负BANKCARD_ACCOUNT + /// </summary> + [JsonProperty("identity_type", NullValueHandling = NullValueHandling.Ignore)] + [Required] + public string IdentityType + { + get; + set; + } + + /// <summary> + /// 鍙備笌鏂圭殑璇佷欢鍙凤紝鏀寔韬唤璇佸彿銆佹姢鐓у彿銆� + /// </summary> + [JsonProperty("cert_no", NullValueHandling = NullValueHandling.Ignore)] + [Required] + public string CertNo + { + get; + set; + } + + /// <summary> + /// 鍙備笌鏂圭殑璇佷欢绫诲瀷銆� + /// </summary> + [JsonProperty("cert_type", NullValueHandling = NullValueHandling.Ignore)] + [Required] + public string CertType + { + get; + set; + } + + /// <summary> + /// 鍙備笌鏂圭湡瀹炲鍚嶏紝濡傛灉闈炵┖锛屽皢鏍¢獙鏀舵鏀粯瀹濊处鍙峰鍚嶄竴鑷存�с�傚綋identity_type=ALIPAY_LOGON_ID鏃讹紝鏈瓧娈靛繀濉�� + /// 鏀舵鏂归摱琛岃处鎴峰悕绉� + /// </summary> + [JsonProperty("name", NullValueHandling = NullValueHandling.Ignore)] + public string Name + { + get; + set; + } + + /// <summary> + /// 鎻忚堪鍙備笌鏂逛俊鎭殑鎵╁睍灞炴�э紝浣跨敤鍓嶈涓庢敮浠樺疂宸ョ▼甯堢‘璁� + /// </summary> + [JsonProperty("ext_info", NullValueHandling = NullValueHandling.Ignore)] + public string ExtInfo + { + get; + set; + } + + [JsonProperty("bankcard_ext_info", NullValueHandling = NullValueHandling.Ignore)] + public BankcardExtInfo BankCardExtInfo + { + get; + set; + } + } + + public class BankcardExtInfo + { + /// <summary> + /// 褰撴敹娆捐处鎴蜂负瀵瑰叕璐︽埛鏃讹紝鏈烘瀯鍚嶇О蹇呭~锛涘綋鏀舵璐︽埛涓哄绉佽处鎴锋椂锛屾満鏋勫悕绉板彲涓虹┖銆� 濡傦細浜ら�氶摱琛� + /// </summary> + [JsonProperty("inst_name", NullValueHandling = NullValueHandling.Ignore)] + public string InstName + { + get; + set; + } + + /// <summary> + /// 鏀舵璐︽埛绫诲瀷銆� + /// 1锛氬鍏紙鍦ㄩ噾铻嶆満鏋勫紑璁剧殑鍏徃璐︽埛锛�,濡傛灉閾惰鍗′负瀵瑰叕锛屽繀椤讳紶閫掔渷甯傛敮琛屼俊鎭垨鑰呰仈琛屽彿 + /// 2锛氬绉侊紙鍦ㄩ噾铻嶆満鏋勫紑璁剧殑涓汉璐︽埛锛� + /// </summary> + [JsonProperty("account_type", NullValueHandling = NullValueHandling.Ignore)] + public string AccountType + { + get; + set; + } + + /// <summary> + /// 閾惰鎵�鍦ㄧ渷浠� + /// </summary> + [JsonProperty("inst_province", NullValueHandling = NullValueHandling.Ignore)] + public string InstProvince + { + get; + set; + } + + /// <summary> + /// 鏀舵閾惰鎵�鍦ㄥ競 + /// </summary> + [JsonProperty("inst_city", NullValueHandling = NullValueHandling.Ignore)] + public string InstCity + { + get; + set; + } + + /// <summary> + /// 鏀舵閾惰鎵�灞炴敮琛� + /// </summary> + [JsonProperty("inst_branch_name", NullValueHandling = NullValueHandling.Ignore)] + public string InstBranchName + { + get; + set; + } + + /// <summary> + /// 閾惰鏀鑱旇鍙� + /// </summary> + [JsonProperty("bank_code", NullValueHandling = NullValueHandling.Ignore)] + public string BankCode + { + get; + set; + } + } +} diff --git a/LifePayment/LifePayment.Domain.Shared/AlipayModel/FundTransPagePayResponse.cs b/LifePayment/LifePayment.Domain.Shared/AlipayModel/FundTransPagePayResponse.cs new file mode 100644 index 0000000..7a9ffcd --- /dev/null +++ b/LifePayment/LifePayment.Domain.Shared/AlipayModel/FundTransPagePayResponse.cs @@ -0,0 +1,49 @@ +锘縰sing Newtonsoft.Json; +using Tea; + +namespace LifePayment.Domain +{ + public class FundTransPagePayResponse : AlipayBaseOutput + { + /// <summary> + /// 鍟嗘埛绔殑鍞竴璁㈠崟鍙� + /// </summary> + [NameInMap("out_biz_no")] + public string OutBizNo + { + get; + set; + } + + /// <summary> + /// SUCCESS锛氫唬鍙戞垚鍔燂紱 + /// </summary> + [NameInMap("status")] + public string Status + { + get; + set; + } + + /// <summary> + /// 璇ョ瑪浠e彂鍦ㄦ敮浠樺疂绯荤粺鍐呴儴鐨勫崟鎹甀D + /// </summary> + [NameInMap("order_id")] + public string OrderId + { + get; + set; + } + } + + public class AlipayFundTransPagePayResponse : TeaModel + { + /// <summary> + /// 璁㈠崟淇℃伅锛孎orm琛ㄥ崟褰㈠紡 + /// </summary> + [NameInMap("body")] + public string Body { get; set; } + + } + +} diff --git a/LifePayment/LifePayment.Domain.Shared/AlipayModel/FundTransUniTransferInput.cs b/LifePayment/LifePayment.Domain.Shared/AlipayModel/FundTransUniTransferInput.cs new file mode 100644 index 0000000..bf09414 --- /dev/null +++ b/LifePayment/LifePayment.Domain.Shared/AlipayModel/FundTransUniTransferInput.cs @@ -0,0 +1,116 @@ +锘縰sing Newtonsoft.Json; +using System.ComponentModel.DataAnnotations; + +namespace LifePayment.Domain +{ + public class FundTransUniTransferInput + { + /// <summary> + /// 鍟嗘埛绔殑鍞竴璁㈠崟鍙凤紝瀵逛簬鍚屼竴绗旇浆璐﹁姹傦紝鍟嗘埛闇�淇濊瘉璇ヨ鍗曞彿鍞竴銆� + /// </summary> + [JsonProperty("out_biz_no", NullValueHandling = NullValueHandling.Ignore)] + [Required] + public string OutBizNo + { + get; + set; + } + + /// <summary> + /// 璁㈠崟鎬婚噾棰濓紝鍗曚綅涓哄厓锛岀簿纭埌灏忔暟鐐瑰悗涓や綅锛屽彇鍊艰寖鍥碵0.01, 100000000] + /// </summary> + [JsonProperty("trans_amount", NullValueHandling = NullValueHandling.Ignore)] + [Required] + public string TransAmount + { + get; + set; + } + + /// <summary> + /// 浜у搧鐮侊紝鍗曠瑪鏃犲瘑杞处鍒伴摱琛屽崱鍥哄畾涓篢RANS_BANKCARD_NO_PWD + /// </summary> + [JsonProperty("product_code", NullValueHandling = NullValueHandling.Ignore)] + [Required] + public string ProductCode + { + get; + set; + } + + /// <summary> + /// Participant绫诲瀷锛屾敹娆炬柟淇℃伅 + /// </summary> + [JsonProperty("payee_info", NullValueHandling = NullValueHandling.Ignore)] + [Required] + public Participant PayeeInfo + { + get; + set; + } + + /// <summary> + /// Participant绫诲瀷锛屼粯娆炬柟淇℃伅 + /// </summary> + [JsonProperty("payer_info", NullValueHandling = NullValueHandling.Ignore)] + [Required] + public Participant PayerInfo + { + get; + set; + } + /// <summary> + /// C2C鐜伴噾绾㈠寘-绾㈠寘棰嗗彇鏃讹紝蹇呬紶姝ゅ瓧娈点�備紶绾㈠寘鏀粯鏃惰繑鍥炵殑鏀粯瀹濆崟鍙凤紱B2C鐜伴噾绾㈠寘銆佸崟绗旀棤瀵嗚浆璐﹀埌鏀粯瀹濅笉闇�瑕佽鍙傛暟銆� + /// </summary> + [JsonProperty("original_order_id", NullValueHandling = NullValueHandling.Ignore)] + public string OriginalOrderId + { + get; + set; + } + + /// <summary> + /// 涓氬姟鍦烘櫙锛屽崟绗旀棤瀵嗚浆璐﹀埌閾惰鍗″浐瀹氫负DIRECT_TRANSFER + /// </summary> + [JsonProperty("biz_scene", NullValueHandling = NullValueHandling.Ignore)] + [Required] + public string BizScene + { + get; + set; + } + + /// <summary> + /// 杞处涓氬姟鐨勬爣棰橈紝鐢ㄤ簬鍦ㄦ敮浠樺疂鐢ㄦ埛鐨勮处鍗曢噷鏄剧ず銆� + /// </summary> + [JsonProperty("order_title", NullValueHandling = NullValueHandling.Ignore)] + [Required] + public string OrderTitle + { + get; + set; + } + + /// <summary> + /// 涓氬姟澶囨敞 + /// </summary> + [JsonProperty("remark", NullValueHandling = NullValueHandling.Ignore)] + public string Remark + { + get; + set; + } + + /// <summary> + /// 杞处涓氬姟璇锋眰鐨勬墿灞曞弬鏁帮紝鏀寔浼犲叆鐨勬墿灞曞弬鏁板涓嬶細 + /// 1锛墂ithdraw_timeliness涓鸿浆璐﹀埌閾惰鍗$殑棰勬湡鍒拌处鏃堕棿锛屽彲閫夛紙涓嶄紶鍏ュ垯榛樿涓篢1锛夛紝T0琛ㄧず棰勬湡T+0鍒拌处锛孴1琛ㄧず棰勬湡T+1鍒拌处锛屽埌璐︽椂鏁堝彈閾惰鏈烘瀯澶勭悊褰卞搷锛屾敮浠樺疂鏃犳硶淇濊瘉涓�瀹氭槸T0鎴栬�匱1鍒拌处锛� + /// 2锛塻ub_merchant_info涓轰簩绾у晢鎴蜂俊鎭紝鍙�夛紝瀵瑰簲鍊间负json瀛楃涓�(subMerchantName鏄簩绾у晢鎴蜂紒涓氬悕绉般�乻ubMerchantMCC鏄簩绾у晢鎴稭CC琛屼笟鐮�) + /// </summary> + [JsonProperty("business_params", NullValueHandling = NullValueHandling.Ignore)] + public string BusinessParams + { + get; + set; + } + } +} diff --git a/LifePayment/LifePayment.Domain.Shared/AlipayModel/FundTransUniTransferResponse.cs b/LifePayment/LifePayment.Domain.Shared/AlipayModel/FundTransUniTransferResponse.cs new file mode 100644 index 0000000..ef91f1b --- /dev/null +++ b/LifePayment/LifePayment.Domain.Shared/AlipayModel/FundTransUniTransferResponse.cs @@ -0,0 +1,76 @@ +锘縰sing Newtonsoft.Json; +using Tea; + +namespace LifePayment.Domain +{ + public class FundTransUniTransferResponse : AlipayBaseOutput + { + /// <summary> + /// 鍟嗘埛璁㈠崟鍙� + /// </summary> + [NameInMap("out_biz_no")] + public string OutBizNo + { + get; + set; + } + + /// <summary> + /// 鏀粯瀹濊浆璐﹁鍗曞彿 + /// </summary> + [NameInMap("order_id")] + public string OrderId + { + get; + set; + } + + + /// <summary> + /// 璁㈠崟鏀粯鏃堕棿锛屾牸寮忎负yyyy-MM-dd HH:mm:ss + /// </summary> + [NameInMap("trans_date")] + public string TransDate + { + get; + set; + } + + /// <summary> + /// 閲戣瀺鏈烘瀯鍙戣捣绛剧害绫汇�佹敮浠樼被銆佸樊閿欑被涓氬姟鏃讹紝搴斾负姣忕瑪涓氬姟鍒嗛厤鍞竴鐨勪氦鏄撴祦姘村彿銆� + /// 31浣嶄氦鏄撴祦姘村彿缁勬垚瑙勫垯涓猴細鈥�8浣嶆棩鏈熲��+鈥�16浣嶅簭鍒楀彿鈥�+鈥�1浣嶉鐣欎綅鈥�+鈥�6浣嶆帶鍒朵綅鈥濓紝鍏朵腑锛� a锛� + /// 鈥�8浣嶆棩鏈熲�濅负绯荤粺褰撳墠鏃ユ湡锛孖SODate鏍煎紡锛氣�淵YYYMMDD鈥� b锛夆��16浣嶅簭鍒楀彿鈥濈敱閲戣瀺鏈烘瀯鐢熸垚锛� + /// 閲戣瀺鏈烘瀯搴旂‘淇濊鍊煎湪缃戣仈褰撴棩鍞竴 c锛夆��1浣嶉鐣欎綅鈥濈敱骞冲彴鍒嗛厤 d锛夆��6浣嶆帶鍒朵綅鈥濈敱閲戣瀺鏈烘瀯閫氳繃骞冲彴鑾峰彇 渚嬪锛�2023052993044491260542090100400 + /// </summary> + [NameInMap("settle_serial_no")] + public string SettleSerialNo + { + get; + set; + } + + /// <summary> + /// 鏀粯瀹濇敮浠樿祫閲戞祦姘村彿 + /// </summary> + [NameInMap("pay_fund_order_id")] + public string PayFundOrderId + { + get; + set; + } + + /// <summary> + /// 杞处鍗曟嵁鐘舵�併�� + /// SUCCESS锛氭垚鍔燂紙瀵硅浆璐﹀埌閾惰鍗$殑鍗曟嵁, 璇ョ姸鎬佸彲鑳藉彉涓洪��绁╗REFUND] 鐘舵�侊級锛� + /// FAIL锛氬け璐ワ紱 + /// DEALING锛氬鐞嗕腑锛� + /// REFUND锛氶��绁紱 + /// </summary> + [NameInMap("status")] + public string Stauts + { + get; + set; + } + } +} diff --git a/LifePayment/LifePayment.Domain.Shared/AlipayModel/NotifyUserAgreementPageSignInput.cs b/LifePayment/LifePayment.Domain.Shared/AlipayModel/NotifyUserAgreementPageSignInput.cs new file mode 100644 index 0000000..4a1865c --- /dev/null +++ b/LifePayment/LifePayment.Domain.Shared/AlipayModel/NotifyUserAgreementPageSignInput.cs @@ -0,0 +1,146 @@ +锘縰sing Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace LifePayment.Domain +{ + public class NotifyUserAgreementPageSignInput + { + /// <summary> + /// 鍗忚浜у搧鐮侊紝鍟嗘埛鍜屾敮浠樺疂绛剧害鏃剁‘瀹氾紝涓嶅悓涓氬姟鍦烘櫙瀵瑰簲涓嶅悓鐨勭绾︿骇鍝佺爜銆� + /// </summary> + [JsonProperty("personal_product_code", NullValueHandling = NullValueHandling.Ignore)] + public string PersonalProductCode + { + get; + set; + } + + /// <summary> + /// INDUSTRY|SATF_ACC 褰撳墠绛剧害鐨勫崗璁満鏅�� + /// </summary> + [JsonProperty("sign_scene", NullValueHandling = NullValueHandling.Ignore)] + public string SignScene + { + get; + set; + } + + /// <summary> + /// 鍗忚褰撳墠鐘舵�� + /// 1. TEMP锛氭殏瀛橈紝鍗忚鏈敓鏁堣繃锛� + /// 2. NORMAL锛氭甯革紱 + /// 3. STOP锛氭殏鍋溿�� + /// </summary> + [JsonProperty("status", NullValueHandling = NullValueHandling.Ignore)] + public string Status + { + get; + set; + } + + /// <summary> + /// 2088101143488930 鐢ㄦ埛绛剧害鐨勬敮浠樺疂璐﹀彿瀵瑰簲鐨勬敮浠樺疂鍞竴鐢ㄦ埛鍙枫�� 浠�2088寮�澶寸殑16浣嶇函鏁板瓧缁勬垚銆� + /// </summary> + [JsonProperty("alipay_user_id", NullValueHandling = NullValueHandling.Ignore)] + public string AlipayUserId + { + get; + set; + } + + /// <summary> + /// 20170502000610755993 鏀粯瀹濈郴缁熶腑鐢ㄤ互鍞竴鏍囪瘑鐢ㄦ埛绛剧害璁板綍鐨勭紪鍙枫�� + /// </summary> + [JsonProperty("agreement_no", NullValueHandling = NullValueHandling.Ignore)] + public string AgreementNo + { + get; + set; + } + + /// <summary> + /// 鏀粯瀹濅唬鎵e崗璁殑瀹為檯绛剧害鏃堕棿锛屾牸寮忎负yyyy-MM-dd HH:mm:ss銆� + /// </summary> + [JsonProperty("sign_time", NullValueHandling = NullValueHandling.Ignore)] + public string SignTime + { + get; + set; + } + + /// <summary> + /// 13852852877 鐢ㄦ埛鍦ㄥ晢鎴风綉绔欑殑鐧诲綍璐﹀彿锛屽鏋滃晢鎴锋帴鍙d腑鏈紶锛屽垯涓嶄細杩斿洖銆� + /// </summary> + [JsonProperty("external_logon_id", NullValueHandling = NullValueHandling.Ignore)] + public string ExternalLogonId + { + get; + set; + } + + /// <summary> + /// 鏀粯瀹濆垎閰嶇粰寮�鍙戣�呯殑搴旂敤Id + /// </summary> + [JsonProperty("app_id", NullValueHandling = NullValueHandling.Ignore)] + public string AppId + { + get; + set; + } + + /// <summary> + /// 2017060101317935 鏀粯瀹濆垎閰嶇粰鍟嗘埛鐨勫簲鐢↖d + /// </summary> + [JsonProperty("auth_app_id", NullValueHandling = NullValueHandling.Ignore)] + public string AuthAppId + { + get; + set; + } + + /// <summary> + /// 浠f墸鍗忚涓爣绀虹敤鎴风殑鍞竴绛剧害鍙凤紙纭繚鍦ㄥ晢鎴风郴缁熶腑鍞竴锛夈�� + /// </summary> + [JsonProperty("external_agreement_no", NullValueHandling = NullValueHandling.Ignore)] + public string ExternalAgreementNo + { + get; + set; + } + + /// <summary> + /// 2017-05-20 11:49:19 鐢ㄦ埛浠f墸鍗忚鐨勫疄闄呯敓鏁堟椂闂达紝鏍煎紡涓簓yyy-MM-dd HH:mm:ss銆� + /// </summary> + [JsonProperty("valid_time", NullValueHandling = NullValueHandling.Ignore)] + public string ValidTime + { + get; + set; + } + + /// <summary> + /// 杩斿洖鑴辨晱鐨勬敮浠樺疂璐﹀彿銆� + /// </summary> + [JsonProperty("alipay_logon_id", NullValueHandling = NullValueHandling.Ignore)] + public string AlipayLogonId + { + get; + set; + } + + /// <summary> + /// 鐢ㄦ埛绛剧害鎴愬姛閫氱煡绫诲瀷 + /// </summary> + [JsonProperty("notify_type", NullValueHandling = NullValueHandling.Ignore)] + public string NotifyType + { + get; + set; + } + } +} diff --git a/LifePayment/LifePayment.Domain.Shared/AlipayModel/UserAgreementPageSignInput.cs b/LifePayment/LifePayment.Domain.Shared/AlipayModel/UserAgreementPageSignInput.cs new file mode 100644 index 0000000..8058d7d --- /dev/null +++ b/LifePayment/LifePayment.Domain.Shared/AlipayModel/UserAgreementPageSignInput.cs @@ -0,0 +1,327 @@ +锘縰sing Newtonsoft.Json; +using System.ComponentModel.DataAnnotations; + +namespace LifePayment.Domain +{ + public class UserAgreementPageSignInput + { + /// <summary> + /// 涓汉绛剧害浜у搧鐮侊紝鍟嗘埛鍜屾敮浠樺疂绛剧害鏃剁‘瀹氾紝鍟嗘埛鍙挩璇㈡妧鏈敮鎸併�傚�硷細GENERAL_WITHHOLDING_P + /// </summary> + [JsonProperty("personal_product_code", NullValueHandling = NullValueHandling.Ignore)] + [Required] + public string PersonalProductCode + { + get; + set; + } + + /// <summary> + /// 璇锋寜褰撳墠鎺ュ叆鐨勬柟寮忚繘琛屽~鍏咃紝涓旇緭鍏ュ�煎繀椤讳负鏂囨。涓殑鍙傛暟鍙栧�艰寖鍥淬�� + /// 鎵爜鎴栬�呯煭淇¢〉闈㈢绾﹂渶瑕佹嫾瑁卙ttp鐨勮姹傚湴鍧�璁块棶涓棿椤甸潰锛岄挶鍖卙5椤甸潰绛剧害鍙洿鎺ユ嫾鎺cheme鐨勮姹傚湴鍧� + /// </summary> + [JsonProperty("access_params", NullValueHandling = NullValueHandling.Ignore)] + [Required] + public AccessParams AccessParams + { + get; + set; + } + + /// <summary> + /// 銆愭弿杩般�戝懆鏈熺鎺ц鍒欏弬鏁皃eriod_rule_params锛屽湪绛剧害鍛ㄦ湡鎵f浜у搧锛堝CYCLE_PAY_AUTH_P锛夋椂蹇呬紶锛屽湪绛剧害鍏朵粬浜у搧鏃舵棤闇�浼犲叆銆� + /// 鍛ㄦ湡鎵f浜у搧锛屼細鎸夌収杩欓噷浼犲叆鐨勫弬鏁版彁绀虹敤鎴凤紝骞跺鍙戣捣鎵f鐨勬椂闂淬�侀噾棰濄�佹鏁扮瓑鍋氱浉搴旈檺鍒躲�� + /// </summary> + [JsonProperty("period_rule_params", NullValueHandling = NullValueHandling.Ignore)] + public PeriodRuleParams PeriodRuleParams + { + get; + set; + } + + /// <summary> + /// 閿�鍞骇鍝佺爜锛屽晢鎴风绾︾殑鏀粯瀹濆悎鍚屾墍瀵瑰簲鐨勪骇鍝佺爜銆傚�硷細GENERAL_WITHHOLDING + /// </summary> + [JsonProperty("product_code", NullValueHandling = NullValueHandling.Ignore)] + [Required] + public string ParentBranchNo + { + get; + set; + } + + /// <summary> + /// 鐢ㄦ埛鍦ㄥ晢鎴风綉绔欑殑鐧诲綍璐﹀彿锛岀敤浜庡湪绛剧害椤甸潰灞曠ず锛屽鏋滀负绌猴紝鍒欎笉灞曠ず + /// </summary> + [JsonProperty("external_logon_id", NullValueHandling = NullValueHandling.Ignore)] + [Required] + public string ExternalLogonId + { + get; + set; + } + + /// <summary> + /// 鍗忚绛剧害鍦烘櫙锛屽晢鎴峰彲鏍规嵁 浠f墸浜у搧甯歌鍦烘櫙鍊� 閫夋嫨绗﹀悎鑷韩鐨勮涓氬満鏅�� 璇存槑锛氬綋浼犲叆鍟嗘埛绛剧害鍙� external_agreement_no 鏃讹紝鏈弬鏁板繀濉紝涓嶈兘涓洪粯璁ゅ�� DEFAULT|DEFAULT銆� + /// </summary> + [JsonProperty("sign_scene", NullValueHandling = NullValueHandling.Ignore)] + [Required] + public string SignScene + { + get; + set; + } + + /// <summary> + /// 鍟嗗绛剧害鐨勪骇鍝佺爜锛屽浐瀹氬�笺�傚畨鍏ㄥ彂-鏈嶅姟鍟嗘ā寮忥紙鍗曠瑪杞处鍒版敮浠樺疂璐︽埛锛� + /// </summary> + [JsonProperty("product_code", NullValueHandling = NullValueHandling.Ignore)] + [Required] + public string ProductCode + { + get; + set; + } + + /// <summary> + /// 鍟嗘埛绛剧害鍙凤紝浠f墸鍗忚涓爣绀虹敤鎴风殑鍞竴绛剧害鍙凤紙纭繚鍦ㄥ晢鎴风郴缁熶腑鍞竴锛夈�� + /// 鏍煎紡瑙勫垯锛氭敮鎸佸ぇ鍐欏皬鍐欏瓧姣嶅拰鏁板瓧锛屾渶闀�32浣嶃�� + /// 鍟嗘埛绯荤粺鎸夐渶浼犲叆锛屽鏋滃悓涓�鐢ㄦ埛鍦ㄥ悓涓�浜у搧鐮併�佸悓涓�绛剧害鍦烘櫙涓嬶紝绛捐浜嗗浠戒唬鎵e崗璁紝閭d箞闇�瑕佹寚瀹氬苟浼犲叆璇ュ�笺�� + /// </summary> + [JsonProperty("external_agreement_no", NullValueHandling = NullValueHandling.Ignore)] + [Required] + public string ExternalAgreementNo + { + get; + set; + } + + /// <summary> + /// 绛剧害绗笁鏂逛富浣撶被鍨嬨�傚浜庝笁鏂瑰崗璁紝琛ㄧず褰撳墠鐢ㄦ埛鍜屽摢涓�绫荤殑绗笁鏂逛富浣撹繘琛岀绾︺�� + /// 鍙栧�艰寖鍥达細 + /// 1. PARTNER锛堝钩鍙板晢鎴凤級 + /// 2. MERCHANT锛堥泦鍥㈠晢鎴凤級锛岄泦鍥笅瀛愬晢鎴峰彲鍏变韩鐢ㄦ埛绛剧害鍐呭 + /// 榛樿涓篜ARTNER銆� + /// </summary> + [JsonProperty("third_party_type", NullValueHandling = NullValueHandling.Ignore)] + [Required] + public string ThirdPartyType + { + get; + set; + } + + /// <summary> + /// 褰撳墠鐢ㄦ埛绛剧害璇锋眰鐨勫崗璁湁鏁堝懆鏈熴�� + /// 鏁村舰鏁板瓧鍔犱笂鏃堕棿鍗曚綅鐨勫崗璁湁鏁堟湡锛屼粠鍙戣捣绛剧害璇锋眰鐨勬椂闂村紑濮嬬畻璧枫�� + /// 鐩墠鏀寔鐨勬椂闂村崟浣嶏細 + /// 1. d锛氬ぉ + /// 2. m锛氭湀 + /// 濡傛灉鏈紶鍏ワ紝榛樿涓洪暱鏈熸湁鏁堛�� + /// </summary> + [JsonProperty("sign_validity_period", NullValueHandling = NullValueHandling.Ignore)] + public string SignValidityPeriod + { + get; + set; + } + + /// <summary> + /// 绛剧害钀ラ攢鍙傛暟锛屾鍊间负json鏍煎紡锛涘叿浣撶殑key闇�涓庤惀閿�绾﹀畾 + /// </summary> + [JsonProperty("promo_params", NullValueHandling = NullValueHandling.Ignore)] + public string PromoParams + { + get; + set; + } + + /// <summary> + /// 姝ゅ弬鏁扮敤浜庝紶閫掑瓙鍟嗘埛淇℃伅锛屾棤鐗规畩闇�姹傛椂涓嶇敤鍏虫敞銆� + /// 鐩墠鍟嗘埛浠f墸銆佹捣澶栦唬鎵c�佹窐鏃呰淇$敤浣忎骇鍝佹敮鎸佷紶鍏ヨ鍙傛暟锛堝湪閿�鍞柟妗堜腑鈥滄槸鍚﹀厑璁歌嚜瀹氫箟瀛愬晢鎴蜂俊鎭�濋渶瑕侀�夋槸锛夈�� + /// </summary> + [JsonProperty("sub_merchant", NullValueHandling = NullValueHandling.Ignore)] + public SubMerchantParams SubMerchantParams + { + get; + set; + } + + /// <summary> + /// 鍗忚鐢熸晥绫诲瀷, 鐢ㄤ簬鎸囧畾鍗忚鏄珛鍗崇敓鏁堣繕鏄瓑寰呭晢鎴烽�氱煡鍐嶇敓鏁�. 鍙┖, 涓嶅~榛樿涓虹珛鍗崇敓鏁�. + /// </summary> + [JsonProperty("agreement_effect_type", NullValueHandling = NullValueHandling.Ignore)] + public string AgreementEffectType + { + get; + set; + } + + /// <summary> + /// 鐢ㄦ埛瀹炲悕淇℃伅鍙傛暟锛屽寘鍚細濮撳悕銆佽韩浠借瘉鍙枫�佺绾︽寚瀹歶id銆傚晢鎴蜂紶鍏ョ敤鎴峰疄鍚嶄俊鎭弬鏁帮紝鏀粯瀹濅細瀵规瘮鐢ㄦ埛鍦ㄦ敮浠樺疂绔殑瀹炲悕淇℃伅銆� + /// </summary> + [JsonProperty("identity_params", NullValueHandling = NullValueHandling.Ignore)] + public IdentityParams IdentityParams + { + get; + set; + } + + /// <summary> + /// 鍟嗘埛甯屾湜闄愬埗鐨勭绾︾敤鎴风殑骞撮緞鑼冨洿锛宮in琛ㄧず鍙璇ュ崗璁殑鐢ㄦ埛骞撮緞涓嬮檺锛宮ax琛ㄧず骞撮緞涓婇檺銆傚{"min": "18","max": "30"}琛ㄧず18=<骞撮緞<=30鐨勭敤鎴峰彲浠ョ绾﹁鍗忚銆� + /// </summary> + [JsonProperty("user_age_range", NullValueHandling = NullValueHandling.Ignore)] + public string UserAgeRange + { + get; + set; + } + + /// <summary> + /// 绛剧害鏈夋晥鏃堕棿闄愬埗锛屽崟浣嶆槸绉掞紝鏈夋晥鑼冨洿鏄�0-86400锛屽晢鎴蜂紶鍏ユ瀛楁浼氱敤鍟嗘埛浼犲叆鐨勫�煎惁鍒欎娇鐢ㄦ敮浠樺疂渚ч粯璁ゅ�硷紝鍦ㄦ湁鏁堟椂闂村杩涜绛剧害锛屼細杩涜瀹夊叏鎷︽埅锛涳紙澶囨敞锛氭瀛楁閫傜敤浜庨渶瑕佸紑閫氬畨鍏ㄩ槻鎺х殑鍟嗘埛锛屼笖渚濊禆鍟嗘埛浼犲叆鐢熸垚绛剧害鏃剁殑鏃堕棿鎴冲瓧娈祎imestamp锛� + /// </summary> + [JsonProperty("effect_time", NullValueHandling = NullValueHandling.Ignore)] + public string EffectTime + { + get; + set; + } + } + + public class AccessParams + { + /// <summary> + /// 鐩墠鏀寔浠ヤ笅鍊硷細 + /// 1. ALIPAYAPP 锛堥挶鍖卙5椤甸潰绛剧害锛� + /// 2. QRCODE(鎵爜绛剧害) + /// 3. QRCODEORSMS(鎵爜绛剧害鎴栬�呯煭淇$绾�) + /// </summary> + [JsonProperty("channel", NullValueHandling = NullValueHandling.Ignore)] + [Required] + public string Channel + { + get; + set; + } + } + + public class PeriodRuleParams + { + /// <summary> + /// 銆愭弿杩般�戝懆鏈熺被鍨媝eriod_type鏄懆鏈熸墸娆句骇鍝佸繀濉紝鏋氫妇鍊间负DAY鍜孧ONTH銆� DAY鍗虫墸娆惧懆鏈熸寜澶╄锛孧ONTH浠h〃鎵f鍛ㄦ湡鎸夎嚜鐒舵湀銆� + /// 涓庡彟涓�鍙傛暟period缁勫悎浣跨敤纭畾鎵f鍛ㄦ湡锛屼緥濡俻eriod_type涓篋AY锛宲eriod=30锛屽垯鎵f鍛ㄦ湡涓�30澶╋紱period_type涓篗ONTH锛宲eriod=3锛屽垯鎵f鍛ㄦ湡涓�3涓嚜鐒舵湀銆� 鑷劧鏈堟槸鎸囷紝涓嶈杩欎釜鏈堟湁澶氬皯澶╋紝鍛ㄦ湡閮借绠楀埌鏈堜唤涓殑鍚屼竴鏃ユ湡銆� + /// 渚嬪1鏈�3鏃ュ埌2鏈�3鏃ヤ负涓�涓嚜鐒舵湀锛�1鏈�3鏃ュ埌4鏈�3鏃ヤ负涓変釜鑷劧鏈堛�傛敞鎰忓懆鏈熺被鍨嬩娇鐢∕ONTH鐨勬椂鍊欙紝璁″垝鎵f鏃堕棿execute_time涓嶅厑璁镐紶28鏃ヤ箣鍚庣殑鏃ユ湡锛堝彲浠ヤ紶28鏃ワ級锛屼互姝ら伩鍏嶆湁浜涙湀浠藉彲鑳戒笉瀛樺湪瀵瑰簲鏃ユ湡鐨勬儏鍐点�� + /// 銆愭灇涓惧�笺�� + /// 鑷劧鏃�: DAY + /// 鑷劧鏈�: MONTH + /// </summary> + [JsonProperty("period_type", NullValueHandling = NullValueHandling.Ignore)] + public string PeriodType + { + get; + set; + } + + /// <summary> + /// 銆愭弿杩般�戝懆鏈熸暟period鏄懆鏈熸墸娆句骇鍝佸繀濉�備笌鍙︿竴鍙傛暟period_type缁勫悎浣跨敤纭畾鎵f鍛ㄦ湡锛屼緥濡俻eriod_type涓篋AY锛宲eriod=90锛屽垯鎵f鍛ㄦ湡涓�90澶┿�� + /// </summary> + [JsonProperty("period", NullValueHandling = NullValueHandling.Ignore)] + public string Period + { + get; + set; + } + + /// <summary> + /// 棣栨鎵ц鏃堕棿execute_time鏄懆鏈熸墸娆句骇鍝佸繀濉紝鍗冲晢鎴峰彂璧烽娆℃墸娆剧殑鏃堕棿銆傜簿纭埌鏃ワ紝鏍煎紡涓簓yyy-MM-dd 缁撳悎鍏朵粬蹇呭~鐨勬墸娆惧懆鏈熷弬鏁帮紝浼氱‘瀹氬晢鎴蜂互鍚庣殑鎵f璁″垝銆傚彂璧锋墸娆剧殑鏃堕棿闇�绗﹀悎杩欓噷鐨勬墸娆捐鍒掋�� + /// </summary> + [JsonProperty("execute_time", NullValueHandling = NullValueHandling.Ignore)] + public string ExecuteTime + { + get; + set; + } + + /// <summary> + /// 銆愭弿杩般�戝崟娆℃墸娆炬渶澶ч噾棰漵ingle_amount鏄懆鏈熸墸娆句骇鍝佸繀濉紝鍗虫瘡娆″彂璧锋墸娆炬椂闄愬埗鐨勬渶澶ч噾棰濓紝鍗曚綅涓哄厓銆傚晢鎴锋瘡娆″彂璧锋墸娆鹃兘涓嶅厑璁稿ぇ浜庢閲戦銆� + /// </summary> + [JsonProperty("single_amount", NullValueHandling = NullValueHandling.Ignore)] + public decimal SingleAmount + { + get; + set; + } + + /// <summary> + /// 銆愭弿杩般�戞�婚噾棰濋檺鍒讹紝鍗曚綅涓哄厓銆傚鏋滀紶鍏ユ鍙傛暟锛屽晢鎴峰娆℃墸娆剧殑绱閲戦涓嶅厑璁歌秴杩囨閲戦銆� + /// </summary> + [JsonProperty("total_amount", NullValueHandling = NullValueHandling.Ignore)] + public decimal TotalAmount + { + get; + set; + } + + /// <summary> + /// 銆愭弿杩般�戞�绘墸娆炬鏁般�傚鏋滀紶鍏ユ鍙傛暟锛屽垯鍟嗘埛鎴愬姛鎵f鐨勬鏁颁笉鑳借秴杩囨娆℃暟闄愬埗锛堟墸娆惧け璐ヤ笉璁″叆锛夈�� + /// </summary> + [JsonProperty("total_payments", NullValueHandling = NullValueHandling.Ignore)] + public int TotalPayments + { + get; + set; + } + } + + public class SubMerchantParams + { + /// <summary> + /// 瀛愬晢鎴风殑鍟嗘埛id + /// </summary> + [JsonProperty("sub_merchant_id", NullValueHandling = NullValueHandling.Ignore)] + public string SubMerchantId + { + get; + set; + } + + /// <summary> + /// 瀛愬晢鎴风殑鍟嗘埛鍚嶇О + /// </summary> + [JsonProperty("sub_merchant_name", NullValueHandling = NullValueHandling.Ignore)] + public string SubMerchantName + { + get; + set; + } + + /// <summary> + /// 瀛愬晢鎴风殑鏈嶅姟鍚嶇О + /// </summary> + [JsonProperty("sub_merchant_service_name", NullValueHandling = NullValueHandling.Ignore)] + public string SubMerchantServiceName + { + get; + set; + } + + /// <summary> + /// 瀛愬晢鎴风殑鏈嶅姟鎻忚堪 + /// </summary> + [JsonProperty("sub_merchant_service_description", NullValueHandling = NullValueHandling.Ignore)] + public string SubMerchantServiceDescription + { + get; + set; + } + } + + public class IdentityParams + { + [JsonProperty("cert_no", NullValueHandling = NullValueHandling.Ignore)] + public string CertNo { get; set; } + + [JsonProperty("user_name", NullValueHandling = NullValueHandling.Ignore)] + public string UserName { get; set; } + } +} diff --git a/LifePayment/LifePayment.Domain.Shared/AlipayModel/UserAgreementPageSignResponse.cs b/LifePayment/LifePayment.Domain.Shared/AlipayModel/UserAgreementPageSignResponse.cs new file mode 100644 index 0000000..65649c7 --- /dev/null +++ b/LifePayment/LifePayment.Domain.Shared/AlipayModel/UserAgreementPageSignResponse.cs @@ -0,0 +1,21 @@ +锘縰sing Newtonsoft.Json; +using System.ComponentModel.DataAnnotations; +using Tea; +using ZeroD.Util; + +namespace LifePayment.Domain +{ + public class UserAgreementPageSignResponse: TeaModel + { + /// <summary> + /// 鍗忚浜у搧鐮侊紝鍟嗘埛鍜屾敮浠樺疂绛剧害鏃剁‘瀹氾紝涓嶅悓涓氬姟鍦烘櫙瀵瑰簲涓嶅悓鐨勭绾︿骇鍝佺爜銆� + /// </summary> + [NameInMap("body")] + public string Body + { + get; + set; + } + + } +} diff --git a/LifePayment/LifePayment.Domain.Shared/AlipayModel/UserAgreementQueryInput.cs b/LifePayment/LifePayment.Domain.Shared/AlipayModel/UserAgreementQueryInput.cs new file mode 100644 index 0000000..b2aaead --- /dev/null +++ b/LifePayment/LifePayment.Domain.Shared/AlipayModel/UserAgreementQueryInput.cs @@ -0,0 +1,96 @@ +锘縰sing Newtonsoft.Json; + +namespace LifePayment.Domain +{ + public class UserAgreementQueryInput + { + /// <summary> + /// 鐢ㄦ埛鐨勬敮浠樺疂璐﹀彿瀵瑰簲 鐨勬敮浠樺疂鍞竴鐢ㄦ埛鍙凤紝 鏈弬鏁颁笌alipay_logon_id鑻ラ兘濉啓锛屽垯浠ユ湰鍙傛暟涓哄噯锛屼紭鍏堢骇楂樹簬 alipay_logon_id + /// </summary> + [JsonProperty("alipay_open_id", NullValueHandling = NullValueHandling.Ignore)] + public string AlipayOpenId + { + get; + set; + } + + /// <summary> + /// 涓汉绛剧害浜у搧鐮侊紝鍟嗘埛鍜屾敮浠樺疂绛剧害鏃剁‘瀹氾紝鍟嗘埛鍙挩璇㈡妧鏈敮鎸併�傚�硷細GENERAL_WITHHOLDING_P + /// </summary> + [JsonProperty("personal_product_code", NullValueHandling = NullValueHandling.Ignore)] + public string PersonalProductCode + { + get; + set; + } + + /// <summary> + /// 鐢ㄦ埛鐨勬敮浠樺疂鐧诲綍璐﹀彿锛屾敮鎸侀偖绠辨垨鎵嬫満鍙风爜鏍煎紡銆傛湰鍙傛暟涓巃lipay_user_id鑻ラ兘濉啓锛屽垯浠lipay_user_id 涓哄噯銆� + /// </summary> + [JsonProperty("alipay_logon_id", NullValueHandling = NullValueHandling.Ignore)] + public string AlipayLogonId + { + get; + set; + } + + /// <summary> + /// 绛剧害鍗忚鍦烘櫙锛屽晢鎴峰拰鏀粯瀹濈绾︽椂纭畾锛屽晢鎴峰彲鍜ㄨ鎶�鏈敮鎸併�� + /// 褰撲紶鍏ュ晢鎴风绾﹀彿 external_agreement_no 鏃讹紝鍦烘櫙涓嶈兘涓虹┖鎴栭粯璁ゅ�� DEFAULT|DEFAULT銆� + /// 璇ュ�奸渶瑕佷笌绯荤粺/椤甸潰绛剧害鎺ュ彛璋冪敤鏃朵紶鍏ョ殑鍊间繚鎸佷竴 鑷淬�� + /// </summary> + [JsonProperty("sign_scene", NullValueHandling = NullValueHandling.Ignore)] + public string SignScene + { + get; + set; + } + + /// <summary> + /// 鍟嗘埛绛剧害鍙凤紝浠f墸鍗忚涓爣绀虹敤鎴风殑鍞竴绛剧害鍙凤紙纭繚鍦ㄥ晢鎴风郴缁熶腑鍞竴锛夈�� + /// 鏍煎紡瑙勫垯锛氭敮鎸佸ぇ鍐欏皬鍐欏瓧姣嶅拰鏁板瓧锛屾渶闀�32浣嶃�� + /// 鍟嗘埛绯荤粺鎸夐渶浼犲叆锛屽鏋滃悓涓�鐢ㄦ埛鍦ㄥ悓涓�浜у搧鐮併�佸悓涓�绛剧害鍦烘櫙涓嬶紝绛捐浜嗗浠戒唬鎵e崗璁紝閭d箞闇�瑕佹寚瀹氬苟浼犲叆璇ュ�笺�� + /// </summary> + [JsonProperty("external_agreement_no", NullValueHandling = NullValueHandling.Ignore)] + public string ExternalAgreementNo + { + get; + set; + } + + /// <summary> + /// 绛剧害绗笁鏂逛富浣撶被鍨嬨�傚浜庝笁鏂瑰崗璁紝琛ㄧず褰撳墠鐢ㄦ埛鍜屽摢涓�绫荤殑绗笁鏂逛富浣撹繘琛岀绾︺�� + /// 鍙栧�艰寖鍥达細 + /// 1. PARTNER锛堝钩鍙板晢鎴凤級 + /// 2. MERCHANT锛堥泦鍥㈠晢鎴凤級锛岄泦鍥笅瀛愬晢鎴峰彲鍏变韩鐢ㄦ埛绛剧害鍐呭 + /// 榛樿涓篜ARTNER銆� + /// </summary> + [JsonProperty("third_party_type", NullValueHandling = NullValueHandling.Ignore)] + public string ThirdPartyType + { + get; + set; + } + + /// <summary> + /// 鏀粯瀹濈郴缁熶腑鐢ㄤ互鍞竴鏍囪瘑鐢ㄦ埛绛剧害璁板綍鐨勭紪鍙凤紙鐢ㄦ埛绛剧害鎴愬姛鍚庣殑鍗忚鍙� 锛� 锛屽鏋滀紶浜嗚鍙傛暟锛屽叾浠栧弬鏁颁細琚拷鐣� + /// </summary> + [JsonProperty("agreement_no", NullValueHandling = NullValueHandling.Ignore)] + public string AgreementNo + { + get; + set; + } + + + /// <summary> + /// 閿�鍞骇鍝佺爜锛屽浐瀹氫紶鍏UND_SAFT_SIGN_WITHHOLDING + /// </summary> + [JsonProperty("product_code", NullValueHandling = NullValueHandling.Ignore)] + public string ProductCode + { + get; + set; + } + } +} diff --git a/LifePayment/LifePayment.Domain.Shared/AlipayModel/UserAgreementQueryResponse.cs b/LifePayment/LifePayment.Domain.Shared/AlipayModel/UserAgreementQueryResponse.cs new file mode 100644 index 0000000..f27d50c --- /dev/null +++ b/LifePayment/LifePayment.Domain.Shared/AlipayModel/UserAgreementQueryResponse.cs @@ -0,0 +1,148 @@ +锘縰sing Newtonsoft.Json; +using System.ComponentModel.DataAnnotations; +using Tea; + +namespace LifePayment.Domain +{ + public class UserAgreementQueryResponse : AlipayBaseOutput + { + /// <summary> + /// 鍗忚鐢熸晥鏃堕棿锛屾牸寮忎负 yyyy-MM-dd HH:mm:ss銆� + /// </summary> + [NameInMap("valid_time")] + public string ValidTime + { + get; + set; + } + + /// <summary> + /// 杩斿洖鑴辨晱鐨勬敮浠樺疂璐﹀彿 + /// </summary> + [NameInMap("alipay_logon_id")] + public string AlipayLogonId + { + get; + set; + } + + /// <summary> + /// 鍗忚澶辨晥鏃堕棿锛屾牸寮忎负 yyyy-MM-dd HH:mm:ss銆� + /// </summary> + [NameInMap("invalid_time")] + public string InvalidTime + { + get; + set; + } + + /// <summary> + /// 绛剧害涓讳綋绫诲瀷銆� + /// CARD:鏀粯瀹濊处鍙� + /// CUSTOMER:鏀粯瀹濈敤鎴� + /// </summary> + [NameInMap("pricipal_type")] + public string PricipalType + { + get; + set; + } + + /// <summary> + /// 绛剧害鍗忚鐨勫満鏅�� + /// </summary> + [NameInMap("sign_scene")] + public string SignScene + { + get; + set; + } + + /// <summary> + /// 鐢ㄦ埛绛剧害鎴愬姛鍚庣殑鍗忚鍙� + /// </summary> + [NameInMap("agreement_no")] + public string AgreementNo + { + get; + set; + } + + /// <summary> + /// 绛剧害绗笁鏂逛富浣撶被鍨嬨�傚浜庝笁鏂瑰崗璁紝琛ㄧず褰撳墠鐢ㄦ埛鍜屽摢涓�绫荤殑绗笁鏂逛富浣撹繘琛岀绾︺�� + /// 鍙栧�艰寖鍥达細 + /// 1. PARTNER锛堝钩鍙板晢鎴凤級; + /// 2. MERCHANT锛堥泦鍥㈠晢鎴凤級锛岄泦鍥笅瀛愬晢鎴峰彲鍏变韩鐢ㄦ埛绛剧害鍐呭; + /// 榛樿涓篜ARTNER銆� + /// </summary> + [NameInMap("third_party_type")] + public string ThirdPartyType + { + get; + set; + } + + /// <summary> + /// 鍗忚褰撳墠鐘舵�� + /// 1. TEMP锛氭殏瀛橈紝鍗忚鏈敓鏁堣繃锛� + /// 2. NORMAL锛氭甯革紱 + /// 3. STOP锛氭殏鍋� + /// </summary> + [NameInMap("status")] + public string Status + { + get; + set; + } + + /// <summary> + /// 鍗忚绛剧害鏃堕棿锛屾牸寮忎负 yyyy-MM-dd HH:mm:ss銆� + /// </summary> + [NameInMap("sign_time")] + public string SignTime + { + get; + set; + } + + /// <summary> + /// 鍗忚浜у搧鐮侊紝鍟嗘埛鍜屾敮浠樺疂绛剧害鏃剁‘瀹氾紝涓嶅悓涓氬姟鍦烘櫙瀵瑰簲涓嶅悓鐨勭绾︿骇鍝佺爜銆� + /// </summary> + [NameInMap("personal_product_code")] + public string PersonalProductCode + { + get; + set; + } + + /// <summary> + /// 浠f墸鍗忚涓爣绀虹敤鎴风殑鍞竴绛剧害鍙�(纭繚鍦ㄥ晢鎴风郴缁熶腑鍞竴) + /// </summary> + [NameInMap("external_agreement_no")] + public string ExternalAgreementNo + { + get; + set; + } + + /// <summary> + /// 鐢ㄦ埛鐨勮姖楹讳俊鐢� openId锛屼緵鍟� 鎴锋煡璇㈢敤鎴疯姖楹讳俊鐢ㄤ娇鐢ㄣ�� + /// </summary> + [NameInMap("zm_open_id")] + public string ZmOpenId + { + get; + set; + } + + /// <summary> + /// 澶栭儴鐧诲綍Id + /// </summary> + [NameInMap("external_logon_id")] + public string ExternalLogonId + { + get; + set; + } + } +} diff --git a/LifePayment/LifePayment.Domain.Shared/AlipayModel/UserAgreementUnsignInput.cs b/LifePayment/LifePayment.Domain.Shared/AlipayModel/UserAgreementUnsignInput.cs new file mode 100644 index 0000000..ad7ad55 --- /dev/null +++ b/LifePayment/LifePayment.Domain.Shared/AlipayModel/UserAgreementUnsignInput.cs @@ -0,0 +1,110 @@ +锘縰sing Newtonsoft.Json; +using System.ComponentModel.DataAnnotations; + +namespace LifePayment.Domain +{ + public class UserAgreementUnsignInput + { + /// <summary> + /// 鐢ㄦ埛鐨勬敮浠樺疂璐﹀彿瀵瑰簲鐨勬敮浠樺疂鍞竴鐢ㄦ埛鍙凤紝 鏈弬鏁颁笌alipay_logon_id 涓嶅彲鍚屾椂涓虹┖锛岃嫢閮藉~鍐欙紝鍒欎互鏈弬鏁颁负鍑嗭紝浼樺厛绾ч珮浜巃lipay_logon_id銆� + /// </summary> + [JsonProperty("alipay_open_id", NullValueHandling = NullValueHandling.Ignore)] + [Required] + public string AlipayOpenId + { + get; + set; + } + + /// <summary> + /// 鐢ㄦ埛鐨勬敮浠樺疂鐧诲綍璐﹀彿锛屾敮鎸侀偖绠辨垨鎵嬫満鍙风爜鏍煎紡銆傛湰鍙傛暟涓巃lipay_user_id 涓嶅彲鍚屾椂涓虹┖锛岃嫢閮藉~鍐欙紝鍒欎互alipay_user_id 涓哄噯銆� + /// </summary> + [JsonProperty("alipay_logon_id", NullValueHandling = NullValueHandling.Ignore)] + [Required] + public string AlipayLogonId + { + get; + set; + } + + /// <summary> + /// 鏀粯瀹濈郴缁熶腑鐢ㄤ互鍞竴鏍囪瘑鐢ㄦ埛绛剧害璁板綍鐨勭紪鍙凤紙鐢ㄦ埛绛剧害鎴愬姛鍚庣殑鍗忚鍙� 锛� 锛屽鏋滀紶浜嗚鍙傛暟锛屽叾浠栧弬鏁颁細琚拷鐣� + /// </summary> + [JsonProperty("agreement_no", NullValueHandling = NullValueHandling.Ignore)] + public string AgreementNo + { + get; + set; + } + + /// <summary> + /// 鍟嗘埛绛剧害鍙凤紝浠f墸鍗忚涓爣绀虹敤鎴风殑鍞竴绛剧害鍙凤紙纭繚鍦ㄥ晢鎴风郴缁熶腑鍞竴锛夈�� + /// 鏍煎紡瑙勫垯锛氭敮鎸佸ぇ鍐欏皬鍐欏瓧姣嶅拰鏁板瓧锛屾渶闀�32浣嶃�� + /// 鍟嗘埛绯荤粺鎸夐渶浼犲叆锛屽鏋滃悓涓�鐢ㄦ埛鍦ㄥ悓涓�浜у搧鐮併�佸悓涓�绛剧害鍦烘櫙涓嬶紝绛捐浜嗗浠戒唬鎵e崗璁紝閭d箞闇�瑕佹寚瀹氬苟浼犲叆璇ュ�笺�� + /// </summary> + [JsonProperty("external_agreement_no", NullValueHandling = NullValueHandling.Ignore)] + public string ExternalAgreementNo + { + get; + set; + } + + /// <summary> + /// 鍗忚浜у搧鐮侊紝鍟嗘埛鍜屾敮浠樺疂绛剧害鏃剁‘瀹氾紝涓嶅悓涓氬姟鍦烘櫙瀵瑰簲涓嶅悓鐨勭绾︿骇鍝佺爜銆� + /// </summary> + [JsonProperty("personal_product_code", NullValueHandling = NullValueHandling.Ignore)] + [Required] + public string PersonalProductCode + { + get; + set; + } + + /// <summary> + /// 绛剧害鍗忚鍦烘櫙锛屽晢鎴峰拰鏀粯瀹濈绾︽椂纭畾锛屽晢鎴峰彲鍜ㄨ鎶�鏈敮鎸併�� + /// 褰撲紶鍏ュ晢鎴风绾﹀彿 external_agreement_no 鏃讹紝鍦烘櫙涓嶈兘涓虹┖鎴栭粯璁ゅ�� DEFAULT|DEFAULT銆� + /// 璇ュ�奸渶瑕佷笌绯荤粺/椤甸潰绛剧害鎺ュ彛璋冪敤鏃朵紶鍏ョ殑鍊间繚鎸佷竴 鑷淬�� + /// </summary> + [JsonProperty("sign_scene", NullValueHandling = NullValueHandling.Ignore)] + public string SignScene + { + get; + set; + } + + /// <summary> + /// 绛剧害绗笁鏂逛富浣撶被鍨嬨�傚浜庝笁鏂瑰崗璁紝琛ㄧず褰撳墠鐢ㄦ埛鍜屽摢涓�绫荤殑绗笁鏂逛富浣撹繘琛岀绾︺�� + /// 鍙栧�艰寖鍥达細 + /// 1. PARTNER锛堝钩鍙板晢鎴凤級 + /// 2. MERCHANT锛堥泦鍥㈠晢鎴凤級锛岄泦鍥笅瀛愬晢鎴峰彲鍏变韩鐢ㄦ埛绛剧害鍐呭 + /// 榛樿涓篜ARTNER銆� + /// </summary> + [JsonProperty("third_party_type", NullValueHandling = NullValueHandling.Ignore)] + public string ThirdPartyType + { + get; + set; + } + + /// <summary> + /// 鎵╁睍鍙傛暟 + /// </summary> + [JsonProperty("extend_params", NullValueHandling = NullValueHandling.Ignore)] + public string ExtendParams + { + get; + set; + } + + /// <summary> + /// 鎿嶄綔绫诲瀷: + /// confirm锛堣В绾︾‘璁わ級锛宨nvalid锛堣В绾︿綔搴燂級 + /// </summary> + [JsonProperty("operate_type", NullValueHandling = NullValueHandling.Ignore)] + public string OperateType + { + get; + set; + } + } +} diff --git a/LifePayment/LifePayment.Domain.Shared/Attribute/EnumValidationAttribute.cs b/LifePayment/LifePayment.Domain.Shared/Attribute/EnumValidationAttribute.cs new file mode 100644 index 0000000..ccd19a5 --- /dev/null +++ b/LifePayment/LifePayment.Domain.Shared/Attribute/EnumValidationAttribute.cs @@ -0,0 +1,45 @@ +锘縰sing System; +using System.ComponentModel.DataAnnotations; + +namespace LifePayment.Domain.Shared; + +/// <summary> +/// 鏋氫妇鍊煎己鏍¢獙 +/// </summary> +[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Parameter, AllowMultiple = false)] +public class EnumValidationAttribute : ValidationAttribute +{ + /// <summary> + /// 鏋氫妇绫诲瀷 + /// </summary> + private Type _enumType; + + /// <summary> + /// 鍏佽绌哄�硷紝鏈夊�兼墠楠岃瘉锛岄粯璁� false + /// </summary> + public bool AllowNullValue { get; set; } = false; + + public EnumValidationAttribute(Type enumType) + { + if (!enumType.IsEnum) throw new ArgumentException("Type must be an enum."); + + _enumType = enumType; + } + + public string GetErrorMessage(string name) => + !string.IsNullOrWhiteSpace(ErrorMessage) ? FormatErrorMessage(name) : "Enum value error."; + + protected override ValidationResult IsValid(object value, ValidationContext validationContext) + { + // 鍒ゆ柇鏄惁鍏佽 绌哄�� + if (AllowNullValue && value == null) return ValidationResult.Success; + + if (value != null && Enum.IsDefined(_enumType, value)) + { + return ValidationResult.Success; + } + + return new ValidationResult(GetErrorMessage(validationContext.DisplayName)); + } + +} \ No newline at end of file diff --git a/LifePayment/LifePayment.Domain.Shared/Common/GlobalRandom.cs b/LifePayment/LifePayment.Domain.Shared/Common/GlobalRandom.cs new file mode 100644 index 0000000..6491b8e --- /dev/null +++ b/LifePayment/LifePayment.Domain.Shared/Common/GlobalRandom.cs @@ -0,0 +1,119 @@ +锘縰sing System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace LifePayment.Domain.Shared; + +public static class GlobalRandom +{ + // 瀛楃闆� + private static readonly string LowerCase = "abcdefghijklmnopqrstuvwxyz"; + private static readonly string UpperCase = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; + private static readonly string Digits = "0123456789"; + private static readonly string Symbols = "~`!@#$%^&*\\|()_-+=\\銆亄}\\[\\]'\"<>?.,:;/"; + + /// <summary> + /// 鑾峰彇鎸囧畾浣嶆暟鐨勯殢鏈烘暟 + /// </summary> + /// <param name="length"></param> + /// <returns></returns> + public static string GetRandomNum(int length) + { + + var ranInt = 0; + var minAMax = GetMinAndMaxNumByLength(length); + + ranInt = Random.Shared.Next(minAMax.Min, minAMax.Max + 1); + + return ranInt.ToString().PadLeft(length, '0'); + } + + /// <summary> + /// 鑾峰彇鎸囧畾浣嶆暟鐨勫崄杩涘埗鏁扮殑鏈�澶у�煎拰鏈�灏忓�� + /// </summary> + /// <param name="length"></param> + /// <param name="isOneMin"></param> + /// <returns></returns> + /// <exception cref="ArgumentException"></exception> + public static (int Min, int Max) GetMinAndMaxNumByLength(int length, bool minIsOne = true) + { + if (length <= 0) throw new ArgumentException("length蹇呴』澶т簬绛変簬0"); + + if (length == 0) return (0, 0); + + var min = minIsOne ? 1 : (int)Math.Pow(10, length - 1); + var max = (int)Math.Pow(10, length) - 1; + return (min, max); + } + + /// <summary> + /// 鏍规嵁鎸囧畾闀垮害鍜屽瓧绗︽睜鑾峰彇鎸囧畾闀垮害鐨勯殢鏈哄瓧绗︿覆 + /// </summary> + /// <param name="length"></param> + /// <param name="charPool"></param> + /// <returns></returns> + public static string GetRandomStrFromCharPool(int length, char[] charPool) + { + string result = null; + + if (length > 0 && charPool.IsNotNullOrEmpty()) + { + Shuffle(charPool); + for (int i = 0; i < length; i++) + { + result += charPool[Random.Shared.Next(0, charPool.Length)]; + } + } + + return result; + } + + /// <summary> + /// 鑾峰彇闅忔満瀵嗙爜 + /// </summary> + /// <param name="length"></param> + /// <param name="charPool"></param> + /// <returns></returns> + public static string GetRandomPassword(int minLenth = 6, int maxLenth = 6) + { + // 鐢熸垚涓�涓悎娉曠殑瀛楃涓查暱搴� + int length = minLenth == maxLenth ? minLenth : Random.Shared.Next(minLenth, maxLenth + 1); // 6 鍒� 16 鐨勯殢鏈洪暱搴� + + // 鑷冲皯鍖呭惈涓�涓瓧姣嶃�佹暟瀛楀拰绗﹀彿 + var sb = new StringBuilder(); + sb.Append(LowerCase[Random.Shared.Next(LowerCase.Length)]); // 鍔犱竴涓皬鍐欏瓧姣� + sb.Append(UpperCase[Random.Shared.Next(UpperCase.Length)]); // 鍔犱竴涓ぇ鍐欏瓧姣� + sb.Append(Digits[Random.Shared.Next(Digits.Length)]); // 鍔犱竴涓暟瀛� + //sb.Append(Symbols[Random.Shared.Next(Symbols.Length)]); // 鍔犱竴涓鍙� + + // 濉厖鍏朵綑瀛楃 + var allChars = LowerCase + UpperCase + Digits; + for (int i = sb.Length; i < length; i++) + { + sb.Append(allChars[Random.Shared.Next(allChars.Length)]); + } + + // 鎵撲贡瀛楃椤哄簭锛屼互纭繚瀛楃绉嶇被涓嶈闆嗕腑鍦ㄥ墠闈� + return new string(sb.ToString().OrderBy(c => Random.Shared.Next()).ToArray()); + } + + /// <summary> + /// 闅忔満娲楃墝 + /// </summary> + /// <typeparam name="T"></typeparam> + /// <param name="array"></param> + public static void Shuffle<T>(T[] array) + { + Random rng = new Random(); + int n = array.Length; + for (int i = n - 1; i > 0; i--) + { + int j = rng.Next(i + 1); + (array[i], array[j]) = (array[j], array[i]); // 浜ゆ崲鍏冪礌 + } + } + +} + diff --git a/LifePayment/LifePayment.Domain.Shared/Common/OssSettings.cs b/LifePayment/LifePayment.Domain.Shared/Common/OssSettings.cs new file mode 100644 index 0000000..273d90d --- /dev/null +++ b/LifePayment/LifePayment.Domain.Shared/Common/OssSettings.cs @@ -0,0 +1,31 @@ +锘縩amespace LifePayment.Domain.Shared +{ + public class OssSettings + { + public string OssAccessKeyId { get; set; } + + public string OssAccessSecret { get; set; } + + public string OssEndpoint { get; set; } + + public string OssBucketName { get; set; } + + public string OssUrl { get; set; } + + public string OssRoleRan { get; set; } + } + + public class OssSTSReponse + { + public string Expiration { get; set; } + + public string OssAccessSecret { get; set; } + + public string OssAccessKeyId { get; set; } + + public string SecurityToken { get; set; } + + public string RequestId { get; set; } + + } +} diff --git a/LifePayment/LifePayment.Domain.Shared/Common/TimeUtility.cs b/LifePayment/LifePayment.Domain.Shared/Common/TimeUtility.cs new file mode 100644 index 0000000..20cbc79 --- /dev/null +++ b/LifePayment/LifePayment.Domain.Shared/Common/TimeUtility.cs @@ -0,0 +1,65 @@ +锘縰sing System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace LifePayment.Domain.Shared; + +public static class TimeUtility +{ + /// <summary> + /// 鑾峰彇杩囧幓澶氶暱鏃堕棿瀛楃涓� + /// ToDo鍚庣画鍙互浼樺寲涓烘牴鎹寚瀹氱殑鏃堕棿闂撮殧鏂囨湰瀛楀吀鏉ユ洿鍔犵伒娲荤殑杩斿洖瀵瑰簲鐨勬枃鏈� + /// </summary> + /// <param name="sourceTime"></param> + /// <param name="now"></param> + /// <returns></returns> + public static string GetBeforeTimeStr(DateTime sourceTime, DateTime? now = null) + { + string result = null; + now = now ?? DateTime.Now; + + if (now < sourceTime) + { + return result; + } + + var timeSpan = now.Value.Date - sourceTime.Date; + + switch (timeSpan.TotalDays) + { + case >= 1 and < 2: + result = $"鏄ㄥぉ"; + break; + + case >= 2 and < 3: + result = $"鍓嶅ぉ"; + break; + + case >= 3 and < 30: + result = $"{Math.Floor(timeSpan.TotalDays)}澶╁墠"; + break; + + case >= 30: + result = $"{Math.Floor(timeSpan.TotalDays / 30)}鏈堝墠"; + break; + + default: + timeSpan = now.Value - sourceTime; + if (timeSpan.TotalHours >= 1) + { + result = $"{Math.Floor(timeSpan.TotalHours)}灏忔椂鍓�"; + } + else + { + result = $"鍒氬垰"; + } + break; + } + + return result; + } + +} + diff --git a/LifePayment/LifePayment.Domain.Shared/Enum/LifePay/LifePayEnum.cs b/LifePayment/LifePayment.Domain.Shared/Enum/LifePay/LifePayEnum.cs new file mode 100644 index 0000000..bddbf34 --- /dev/null +++ b/LifePayment/LifePayment.Domain.Shared/Enum/LifePay/LifePayEnum.cs @@ -0,0 +1,51 @@ +锘縰sing System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace LifePayment.Domain.Shared; + +public enum LifePayTypeEnum +{ + WxPay = 10, + + AliPay = 20 +} + +public enum LifePayOrderTypeEnum +{ + 璇濊垂璁㈠崟 = 10, + + 鐢佃垂璁㈠崟 = 20, +} + +public enum LifePayStatusEnum +{ + + 鏈敮浠� = 10, + + 宸叉敮浠� = 20, + + 寰呴��娆� = 30, + + 宸查��娆� = 40 +} + +public enum LifePayOrderStatusEnum +{ + 寰呯‘璁� = 10, + + 宸插け璐� = 20, + + 宸插畬鎴� = 30 +} + +public enum LifePayRateTypeEnum +{ + 榛樿璇濊垂鎶樻墸=10, + + 榛樿鐢佃垂鎶樻墸=20 +} + diff --git a/LifePayment/LifePayment.Domain.Shared/Enum/Wallet/IncomeExpenseTypeEnum.cs b/LifePayment/LifePayment.Domain.Shared/Enum/Wallet/IncomeExpenseTypeEnum.cs new file mode 100644 index 0000000..4e84122 --- /dev/null +++ b/LifePayment/LifePayment.Domain.Shared/Enum/Wallet/IncomeExpenseTypeEnum.cs @@ -0,0 +1,24 @@ +锘縰sing System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace LifePayment.Domain.Shared; + +/// <summary> +/// 鏀舵敮绫诲瀷 +/// </summary> +public enum IncomeExpenseTypeEnum +{ + /// <summary> + /// 鏀跺叆 + /// </summary> + Income = 10, + + /// <summary> + /// 鏀嚭 + /// </summary> + Expense = 20 +} + diff --git a/LifePayment/LifePayment.Domain.Shared/Enum/Wallet/UnionFlagEnum.cs b/LifePayment/LifePayment.Domain.Shared/Enum/Wallet/UnionFlagEnum.cs new file mode 100644 index 0000000..56a4d18 --- /dev/null +++ b/LifePayment/LifePayment.Domain.Shared/Enum/Wallet/UnionFlagEnum.cs @@ -0,0 +1,21 @@ +锘縰sing System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace LifePayment.Domain.Shared +{ + public enum UnionFlagEnum + { + /// <summary> + /// 琛屽唴 + /// </summary> + SameBank = 1 , + + /// <summary> + /// 璺ㄨ + /// </summary> + OtherBank = 0 + } +} diff --git a/LifePayment/LifePayment.Domain.Shared/Enum/Wallet/WalletAccountOpenAlipaySignStatusEnum.cs b/LifePayment/LifePayment.Domain.Shared/Enum/Wallet/WalletAccountOpenAlipaySignStatusEnum.cs new file mode 100644 index 0000000..5c76e40 --- /dev/null +++ b/LifePayment/LifePayment.Domain.Shared/Enum/Wallet/WalletAccountOpenAlipaySignStatusEnum.cs @@ -0,0 +1,23 @@ +锘縰sing System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace LifePayment.Domain.Shared; + +/// <summary> +/// 閽卞寘寮�鎴锋敮浠樺疂绛剧害鐘舵�� +/// </summary> +public enum WalletAccountOpenAlipaySignStatusEnum +{ + /// <summary> + /// 宸茬绾� + /// </summary> + NotSigned = 10, + + /// <summary> + /// 鏈绾� + /// </summary> + Signed = 20 +} diff --git a/LifePayment/LifePayment.Domain.Shared/Enum/Wallet/WalletAccountOpenAlipayStatusEnum.cs b/LifePayment/LifePayment.Domain.Shared/Enum/Wallet/WalletAccountOpenAlipayStatusEnum.cs new file mode 100644 index 0000000..424bb14 --- /dev/null +++ b/LifePayment/LifePayment.Domain.Shared/Enum/Wallet/WalletAccountOpenAlipayStatusEnum.cs @@ -0,0 +1,33 @@ +锘縰sing System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace LifePayment.Domain.Shared; + +/// <summary> +/// 閽卞寘寮�鎴锋敮浠樺疂寮�閫氱姸鎬� +/// </summary> +public enum WalletAccountOpenAlipayStatusEnum +{ + /// <summary> + /// 鏆傚瓨鍗忚鏈�氳繃 + /// </summary> + NotEnabled = 1, + + /// <summary> + /// 姝e父 + /// </summary> + Normal = 2, + + /// <summary> + /// 鏆傚仠,瑙g害 + /// </summary> + Pause = 3, + + /// <summary> + /// 寮傚父 + /// </summary> + Unusual = -1 +} diff --git a/LifePayment/LifePayment.Domain.Shared/Enum/Wallet/WalletAccountOpenBankBindStatusEnum.cs b/LifePayment/LifePayment.Domain.Shared/Enum/Wallet/WalletAccountOpenBankBindStatusEnum.cs new file mode 100644 index 0000000..af0a2f6 --- /dev/null +++ b/LifePayment/LifePayment.Domain.Shared/Enum/Wallet/WalletAccountOpenBankBindStatusEnum.cs @@ -0,0 +1,23 @@ +锘縰sing System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace LifePayment.Domain.Shared; + +/// <summary> +/// 閽卞寘寮�鎴烽摱琛岀粦瀹氱姸鎬� +/// </summary> +public enum WalletAccountOpenBankBindStatusEnum +{ + /// <summary> + /// 鏈粦瀹� + /// </summary> + NotBind = 10, + + /// <summary> + /// 宸茬粦瀹� + /// </summary> + Bind = 20 +} diff --git a/LifePayment/LifePayment.Domain.Shared/Enum/Wallet/WalletAccountOpenBankSignStatusEnum.cs b/LifePayment/LifePayment.Domain.Shared/Enum/Wallet/WalletAccountOpenBankSignStatusEnum.cs new file mode 100644 index 0000000..da47fb6 --- /dev/null +++ b/LifePayment/LifePayment.Domain.Shared/Enum/Wallet/WalletAccountOpenBankSignStatusEnum.cs @@ -0,0 +1,23 @@ +锘縰sing System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace LifePayment.Domain.Shared; + +/// <summary> +/// 閽卞寘寮�鎴烽摱琛屾墭绠$姸鎬� +/// </summary> +public enum WalletAccountOpenBankSignStatusEnum +{ + /// <summary> + /// 寰呮墭绠� + /// </summary> + NotCustodied = 10, + + /// <summary> + /// 宸叉墭绠� + /// </summary> + Custodied = 20 +} diff --git a/LifePayment/LifePayment.Domain.Shared/Enum/Wallet/WalletAccountOpenBankStatusEnum.cs b/LifePayment/LifePayment.Domain.Shared/Enum/Wallet/WalletAccountOpenBankStatusEnum.cs new file mode 100644 index 0000000..5d1f995 --- /dev/null +++ b/LifePayment/LifePayment.Domain.Shared/Enum/Wallet/WalletAccountOpenBankStatusEnum.cs @@ -0,0 +1,23 @@ +锘縰sing System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace LifePayment.Domain.Shared; + +/// <summary> +/// 閽卞寘寮�鎴烽摱琛屽紑閫氱姸鎬� +/// </summary> +public enum WalletAccountOpenBankStatusEnum +{ + /// <summary> + /// 鏈紑閫� + /// </summary> + NotEnabled = 10, + + /// <summary> + /// 宸插紑閫� + /// </summary> + Enabled = 20 +} diff --git a/LifePayment/LifePayment.Domain.Shared/Enum/Wallet/WalletAccountOpenBindInterfaceStatusEnum.cs b/LifePayment/LifePayment.Domain.Shared/Enum/Wallet/WalletAccountOpenBindInterfaceStatusEnum.cs new file mode 100644 index 0000000..4c608c4 --- /dev/null +++ b/LifePayment/LifePayment.Domain.Shared/Enum/Wallet/WalletAccountOpenBindInterfaceStatusEnum.cs @@ -0,0 +1,28 @@ +锘縰sing System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace LifePayment.Domain.Shared; + +/// <summary> +/// 閽卞寘寮�鎴烽摱琛屾帴鍙f牎楠岀姸鎬� +/// </summary> +public enum WalletAccountOpenBindInterfaceStatusEnum +{ + /// <summary> + /// 鍒濆 + /// </summary> + Init = 1, + + /// <summary> + /// 楠岃瘉鏈�氳繃 + /// </summary> + VerificationFailed = 10, + + /// <summary> + /// 楠岃瘉閫氳繃 + /// </summary> + VerificationPassed = 20 +} diff --git a/LifePayment/LifePayment.Domain.Shared/Enum/Wallet/WalletAccountOpenStatusEnum.cs b/LifePayment/LifePayment.Domain.Shared/Enum/Wallet/WalletAccountOpenStatusEnum.cs new file mode 100644 index 0000000..5e83ac3 --- /dev/null +++ b/LifePayment/LifePayment.Domain.Shared/Enum/Wallet/WalletAccountOpenStatusEnum.cs @@ -0,0 +1,39 @@ +锘縰sing System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace LifePayment.Domain.Shared; + +/// <summary> +/// 閽卞寘寮�閫氱姸鎬� +/// </summary> +public enum WalletAccountOpenStatusEnum +{ + /// <summary> + /// 鏈紑閫� + /// </summary> + NotEnabled = 10, + + /// <summary> + /// 宸插紑閫� + /// </summary> + Enabled = 20 +} + +public class WalletAccountTypeMainStatusInfo +{ + public WalletAccountTypeEnum WalletAccountType { get; set; } + + public WalletMainStatusEnum WalletMainStatus { get; set; } +} + +public class WalletAccountOpenStatusInfo +{ + public WalletAccountTypeEnum WalletAccountType { get; set; } + + public WalletAccountOpenStatusEnum WalletAccountOpenStatus { get; set; } +} + + diff --git a/LifePayment/LifePayment.Domain.Shared/Enum/Wallet/WalletAccountTypeEnum.cs b/LifePayment/LifePayment.Domain.Shared/Enum/Wallet/WalletAccountTypeEnum.cs new file mode 100644 index 0000000..72088f5 --- /dev/null +++ b/LifePayment/LifePayment.Domain.Shared/Enum/Wallet/WalletAccountTypeEnum.cs @@ -0,0 +1,51 @@ +锘縰sing System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace LifePayment.Domain.Shared; + +/// <summary> +/// 閽卞寘璐︽埛绫诲瀷鏋氫妇 +/// </summary> +public enum WalletAccountTypeEnum +{ + /// <summary> + /// 骞冲畨閾惰璐︽埛 + /// </summary> + [Description("骞冲畨閾惰")] + PingAn = 10, + + /// <summary> + /// 鏀粯瀹� + /// </summary> + [Description("鏀粯瀹�")] + AliPay = 20, + + /// <summary> + /// 绾夸笅鏀粯 + /// </summary> + [Description("绾夸笅鏀粯")] + OfflinePay = 30, + +} + +public enum TransAccountTypeEnum +{ + /// <summary> + /// 骞冲畨閾惰璐︽埛 + /// </summary> + [Description("閾惰")] + Bank = 10, + + /// <summary> + /// 鏀粯瀹� + /// </summary> + [Description("鏀粯瀹�")] + AliPay = 20, + +} + + diff --git a/LifePayment/LifePayment.Domain.Shared/Enum/Wallet/WalletAmountOperateTypeEnum.cs b/LifePayment/LifePayment.Domain.Shared/Enum/Wallet/WalletAmountOperateTypeEnum.cs new file mode 100644 index 0000000..ae66388 --- /dev/null +++ b/LifePayment/LifePayment.Domain.Shared/Enum/Wallet/WalletAmountOperateTypeEnum.cs @@ -0,0 +1,33 @@ +锘縰sing System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace LifePayment.Domain.Shared; + +/// <summary> +/// 閽卞寘閲戦鎿嶄綔绫诲瀷鏋氫妇 +/// </summary> +public enum WalletAmountOperateTypeEnum +{ + /// <summary> + /// 鏀跺叆 + /// </summary> + Income = 10, + + /// <summary> + /// 浠庝笉鍙敤浣欓涓��杩� + /// </summary> + ReturnFromCanNotUse = 11, + + /// <summary> + /// 鏀嚭骞惰浆绉昏嚦涓嶅彲鐢ㄤ綑棰� + /// </summary> + ExpenseToCanNotUse = 20, + + /// <summary> + /// 鏀嚭 + /// </summary> + Expense = 21, +} diff --git a/LifePayment/LifePayment.Domain.Shared/Enum/Wallet/WalletDetailBusinessTypeEnum.cs b/LifePayment/LifePayment.Domain.Shared/Enum/Wallet/WalletDetailBusinessTypeEnum.cs new file mode 100644 index 0000000..750b8da --- /dev/null +++ b/LifePayment/LifePayment.Domain.Shared/Enum/Wallet/WalletDetailBusinessTypeEnum.cs @@ -0,0 +1,35 @@ +锘縰sing System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace LifePayment.Domain.Shared; + +/// <summary> +/// 閽卞寘鏄庣粏涓氬姟绫诲瀷 +/// </summary> +public enum WalletDetailBusinessTypeEnum +{ + /// <summary> + /// 瀵瑰崟杞处 + /// </summary> + WalletSingleTransfer = 10, + + /// <summary> + /// 鍏呭�� + /// </summary> + WalletRecharge = 20, + + /// <summary> + /// 绾夸笅鎶曚繚 + /// </summary> + InsureOfflinePolicy = 30, + + /// <summary> + /// 鎵归噺杞处 + /// </summary> + WalletBatchTransfer = 40, + + +} diff --git a/LifePayment/LifePayment.Domain.Shared/Enum/Wallet/WalletMainStatusEnum.cs b/LifePayment/LifePayment.Domain.Shared/Enum/Wallet/WalletMainStatusEnum.cs new file mode 100644 index 0000000..e610abd --- /dev/null +++ b/LifePayment/LifePayment.Domain.Shared/Enum/Wallet/WalletMainStatusEnum.cs @@ -0,0 +1,27 @@ +锘縰sing System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace LifePayment.Domain.Shared +{ + public enum WalletMainStatusEnum + { + /// <summary> + /// 姝e父 + /// </summary> + Normal = 10, + + /// <summary> + /// 娉ㄩ攢 + /// </summary> + Cancel = -20, + + /// <summary> + /// 鍐荤粨 + /// </summary> + Freeze = -10 + } + +} diff --git a/LifePayment/LifePayment.Domain.Shared/Enum/Wallet/WalletOperateAmountTypeEnum.cs b/LifePayment/LifePayment.Domain.Shared/Enum/Wallet/WalletOperateAmountTypeEnum.cs new file mode 100644 index 0000000..eab75e9 --- /dev/null +++ b/LifePayment/LifePayment.Domain.Shared/Enum/Wallet/WalletOperateAmountTypeEnum.cs @@ -0,0 +1,44 @@ +锘縰sing System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace LifePayment.Domain.Shared; + +/// <summary> +/// 閽卞寘鎿嶄綔閲戦绫诲瀷鏋氫妇 +/// </summary> +public enum WalletOperateAmountTypeEnum +{ + /// <summary> + /// 鍙敤浣欓 + /// </summary> + [Description("鍙敤浣欓")] + CanUseMoney = 10, + + /// <summary> + /// 瀹氬悜璧勯噾 + /// </summary> + [Description("瀹氬悜璧勯噾")] + DirectMoney = 20, + + /// <summary> + /// 鍙戣柂閽卞寘 + /// </summary> + [Description("鍙戣柂閽卞寘")] + SalaryMoney = 30, + + /// <summary> + /// 涓嶅彲鐢ㄤ綑棰� + /// </summary> + [Description("涓嶅彲鐢ㄤ綑棰�")] + CanNotUseMoney = 40, + + /// <summary> + /// 鍐荤粨浣欓 + /// </summary> + [Description("鍐荤粨浣欓")] + FreezeMoney = 50 +} diff --git a/LifePayment/LifePayment.Domain.Shared/Enum/Wallet/WalletPayChannelEnum.cs b/LifePayment/LifePayment.Domain.Shared/Enum/Wallet/WalletPayChannelEnum.cs new file mode 100644 index 0000000..8c573f9 --- /dev/null +++ b/LifePayment/LifePayment.Domain.Shared/Enum/Wallet/WalletPayChannelEnum.cs @@ -0,0 +1,35 @@ +锘縰sing System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace LifePayment.Domain.Shared +{ + public enum WalletPayChannelSettingStatus + { + /// <summary> + /// 鏈厤缃� + /// </summary> + NotSetting = -10, + + /// <summary> + /// 宸查厤缃� + /// </summary> + IsSetting = 10, + } + + public enum WalletPayChannelStatus + { + /// <summary> + /// 绂佺敤 + /// </summary> + Disable = -10, + + /// <summary> + /// 鍚敤 + /// </summary> + Enable = 10, + } + +} diff --git a/LifePayment/LifePayment.Domain.Shared/Enum/Wallet/WalletPayChannelFeeTypeEnum.cs b/LifePayment/LifePayment.Domain.Shared/Enum/Wallet/WalletPayChannelFeeTypeEnum.cs new file mode 100644 index 0000000..48b6a27 --- /dev/null +++ b/LifePayment/LifePayment.Domain.Shared/Enum/Wallet/WalletPayChannelFeeTypeEnum.cs @@ -0,0 +1,23 @@ +锘縰sing System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace LifePayment.Domain.Shared; + +/// <summary> +/// 閽卞寘鏀粯閫氶亾璐圭巼璁$畻绫诲瀷 +/// </summary> +public enum WalletPayChannelFeeCalculationTypeEnum +{ + /// <summary> + /// 鍗曠瑪 + /// </summary> + SingleStroke = 10, + + /// <summary> + /// 姣斾緥 + /// </summary> + Ratio = 20 +} diff --git a/LifePayment/LifePayment.Domain.Shared/Enum/Wallet/WalletPayTypeEnum.cs b/LifePayment/LifePayment.Domain.Shared/Enum/Wallet/WalletPayTypeEnum.cs new file mode 100644 index 0000000..6115098 --- /dev/null +++ b/LifePayment/LifePayment.Domain.Shared/Enum/Wallet/WalletPayTypeEnum.cs @@ -0,0 +1,32 @@ +锘縰sing System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace LifePayment.Domain.Shared; + +/// <summary> +/// 閽卞寘浠樻绫诲瀷鏋氫妇 +/// </summary> +public enum WalletPayTypeEnum +{ + /// <summary> + /// 鍙敤浣欓 + /// </summary> + [Description("鍙敤浣欓")] + CanUseMoney = 10, + + /// <summary> + /// 瀹氬悜璧勯噾 + /// </summary> + [Description("瀹氬悜璧勯噾")] + DirectMoney = 20, + + /// <summary> + /// 鍙戣柂閽卞寘 + /// </summary> + [Description("鍙戣柂閽卞寘")] + SalaryMoney = 30 +} diff --git a/LifePayment/LifePayment.Domain.Shared/Enum/Wallet/WalletRechargeStatusEnum.cs b/LifePayment/LifePayment.Domain.Shared/Enum/Wallet/WalletRechargeStatusEnum.cs new file mode 100644 index 0000000..4e6552b --- /dev/null +++ b/LifePayment/LifePayment.Domain.Shared/Enum/Wallet/WalletRechargeStatusEnum.cs @@ -0,0 +1,36 @@ +锘縰sing System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace LifePayment.Domain.Shared +{ + public enum WalletRechargeStatusEnum + { + /// <summary> + /// 瀹℃牳涓� + /// </summary> + [Description("瀹℃牳涓�")] + InCheck = 10, + + /// <summary> + /// 鏀粯瀹濊浆璐︾敵璇� + /// </summary> + [Description("鏀粯瀹濊浆璐︾敵璇�")] + TransApply = 11, + + /// <summary> + /// 瀹℃牳鎴愬姛 + /// </summary> + [Description("瀹℃牳鎴愬姛")] + CheckPass = 20, + + /// <summary> + /// 瀹℃牳椹冲洖 + /// </summary> + [Description("瀹℃牳椹冲洖")] + TransactionFail = -10 + } +} diff --git a/LifePayment/LifePayment.Domain.Shared/Enum/Wallet/WalletTransactionStatusEnum.cs b/LifePayment/LifePayment.Domain.Shared/Enum/Wallet/WalletTransactionStatusEnum.cs new file mode 100644 index 0000000..23db737 --- /dev/null +++ b/LifePayment/LifePayment.Domain.Shared/Enum/Wallet/WalletTransactionStatusEnum.cs @@ -0,0 +1,46 @@ +锘縰sing System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace LifePayment.Domain.Shared; + +/// <summary> +/// 閽卞寘璧勯噾娴佹按浜ゆ槗鐘舵�佹灇涓� +/// </summary> +public enum WalletTransactionStatusEnum +{ + /// <summary> + /// 浜ゆ槗涓� + /// </summary> + [Description("浜ゆ槗涓�")] + InTrading = 10, + + /// <summary> + /// 閾惰澶勭悊涓� + /// </summary> + [Description("閾惰澶勭悊涓�")] + BankProcessing = 11, + + /// <summary> + /// 浜ゆ槗鎴愬姛 + /// </summary> + [Description("浜ゆ槗鎴愬姛")] + TransactionSuccess = 20, + + /// <summary> + /// 浜ゆ槗澶辫触 + /// </summary> + [Description("浜ゆ槗澶辫触")] + TransactionFail = 30, + + /// <summary> + /// 閫�绁� + /// </summary> + [Description("閫�绁�")] + Refund = 40 + + +} diff --git a/LifePayment/LifePayment.Domain.Shared/Enum/Wallet/WalletTransferStatusEnum.cs b/LifePayment/LifePayment.Domain.Shared/Enum/Wallet/WalletTransferStatusEnum.cs new file mode 100644 index 0000000..697329e --- /dev/null +++ b/LifePayment/LifePayment.Domain.Shared/Enum/Wallet/WalletTransferStatusEnum.cs @@ -0,0 +1,48 @@ +锘縰sing System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace LifePayment.Domain.Shared +{ + public enum WalletTransferStatusEnum + { + /// <summary> + /// 寰呭鏍� + /// </summary> + [Description("寰呭鏍�")] + PendingReview = 10, + + /// <summary> + /// 瀹℃牳閫氳繃 + /// </summary> + [Description("瀹℃牳閫氳繃")] + Pass = 30, + + /// <summary> + /// 椹冲洖 + /// </summary> + [Description("椹冲洖")] + Reject = 40, + } + + public enum BatchIssuanceRegulatorsStatusEnum + { + /// <summary> + /// 澶辫触 + /// </summary> + Fail = 3, + + /// <summary> + /// 澶勭悊涓� + /// </summary> + Process = 10, + + /// <summary> + /// 鎴愬姛 + /// </summary> + Success = 4, + } +} diff --git a/LifePayment/LifePayment.Domain.Shared/Enum/Wx/WxMiniAppEnum.cs b/LifePayment/LifePayment.Domain.Shared/Enum/Wx/WxMiniAppEnum.cs new file mode 100644 index 0000000..366a85b --- /dev/null +++ b/LifePayment/LifePayment.Domain.Shared/Enum/Wx/WxMiniAppEnum.cs @@ -0,0 +1,26 @@ +锘縰sing System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace LifePayment.Domain.Shared; + +/// <summary> +/// 寰俊灏忕▼搴忔灇涓� +/// </summary> +public enum WxMiniAppEnum +{ + /// <summary> + /// 琛屼笟璧勮灏忕▼搴� + /// </summary> + 琛屼笟璧勮 = 10, + + /// <summary> + /// 浜哄崟鍚堜竴灏忕▼搴� + /// </summary> + 浜哄崟鍚堜竴 = 20, + + 鐢熸椿缂磋垂 = 30 + +} diff --git a/LifePayment/LifePayment.Domain.Shared/Extension/CheckExtensions.cs b/LifePayment/LifePayment.Domain.Shared/Extension/CheckExtensions.cs new file mode 100644 index 0000000..5488c55 --- /dev/null +++ b/LifePayment/LifePayment.Domain.Shared/Extension/CheckExtensions.cs @@ -0,0 +1,83 @@ +锘縰sing Volo.Abp; +#nullable enable + +namespace LifePayment.Domain.Shared; + +/// <summary> +/// 鏍¢獙鎵╁睍 +/// </summary> +public static class CheckExtensions +{ + + /// <summary> + /// 濡傛灉鏍¢獙鏉′欢涓簍rue鍒欐姏鍑哄弸濂藉紓甯� + /// </summary> + /// <param name="checkCondition"></param> + /// <param name="userFriendlyMessage"></param> + /// <exception cref="UserFriendlyException"></exception> + public static void IfTrueThrowUserFriendlyException(bool checkCondition, string userFriendlyMessage) + { + IfTrueThrowUserFriendlyException(checkCondition, null, userFriendlyMessage, null); + } + + /// <summary> + /// 濡傛灉鏍¢獙鏉′欢涓篺alse鍒欐姏鍑哄弸濂藉紓甯� + /// </summary> + /// <param name="checkCondition"></param> + /// <param name="userFriendlyMessage"></param> + /// <exception cref="UserFriendlyException"></exception> + public static void IfFalseThrowUserFriendlyException(bool checkCondition, string userFriendlyMessage) + { + IfFalseThrowUserFriendlyException(checkCondition, userFriendlyMessage, null); + } + + /// <summary> + /// 濡傛灉鏍¢獙鏉′欢涓簍rue鍒欐姏鍑哄弸濂藉紓甯� + /// </summary> + /// <param name="checkCondition"></param> + /// <param name="userFriendlyMessage"></param> + /// <param name="args"></param> + /// <exception cref="UserFriendlyException"></exception> + public static void IfTrueThrowUserFriendlyException(bool checkCondition, string userFriendlyMessage, params object?[]? args) + { + var exceptionString = args == null ? userFriendlyMessage : string.Format(userFriendlyMessage, args); + if (checkCondition) + { + throw new UserFriendlyException(exceptionString); + } + } + + /// <summary> + /// 濡傛灉鏍¢獙鏉′欢涓簍rue鍒欐姏鍑哄弸濂藉紓甯� + /// </summary> + /// <param name="checkCondition"></param> + /// <param name="code"></param + /// <param name="userFriendlyMessage"></param> + /// <param name="args"></param> + /// <exception cref="UserFriendlyException"></exception> + public static void IfTrueThrowUserFriendlyException(bool checkCondition, int? code, string userFriendlyMessage, params object?[]? args) + { + var exceptionString = args == null ? userFriendlyMessage : string.Format(userFriendlyMessage, args); + if (checkCondition) + { + throw new UserFriendlyException(exceptionString, code.HasValue ? code.Value.ToString() : null); + } + } + + /// <summary> + /// 濡傛灉鏍¢獙鏉′欢涓篺alse鍒欐姏鍑哄弸濂藉紓甯� + /// </summary> + /// <param name="checkCondition"></param> + /// <param name="userFriendlyMessage"></param> + /// <param name="args"></param> + /// <exception cref="UserFriendlyException"></exception> + public static void IfFalseThrowUserFriendlyException(bool checkCondition, string userFriendlyMessage, params object?[]? args) + { + var exceptionString = args == null ? userFriendlyMessage : string.Format(userFriendlyMessage, args); + if (!checkCondition) + { + throw new UserFriendlyException(exceptionString); + } + } +} + diff --git a/LifePayment/LifePayment.Domain.Shared/Extension/EnumExtension.cs b/LifePayment/LifePayment.Domain.Shared/Extension/EnumExtension.cs new file mode 100644 index 0000000..10bfd74 --- /dev/null +++ b/LifePayment/LifePayment.Domain.Shared/Extension/EnumExtension.cs @@ -0,0 +1,295 @@ +锘縰sing System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.ComponentModel; +using System.Linq; +using System.Reflection; + +namespace LifePayment.Domain.Shared; + +/// <summary> +/// 鏋氫妇鎷撳睍 +/// </summary> +public static partial class EnumExtension +{ + // 鏋氫妇鏄剧ず瀛楀吀缂撳瓨 + private static readonly ConcurrentDictionary<Type, Dictionary<int, string>> EnumDisplayValueDict = new(); + + // 鏋氫妇鍊煎瓧鍏哥紦瀛� + private static readonly ConcurrentDictionary<Type, Dictionary<int, string>> EnumNameValueDict = new(); + + // 鏋氫妇绫诲瀷缂撳瓨 + private static ConcurrentDictionary<string, Type> _enumTypeDict; + + /// <summary> + /// 鑾峰彇鏋氫妇瀵硅薄Key涓庡悕绉扮殑瀛楀吀锛堢紦瀛橈級 + /// </summary> + /// <param name="enumType"></param> + /// <returns></returns> + public static Dictionary<int, string> GetEnumDictionary(this Type enumType) + { + if (!enumType.IsEnum) + throw new ArgumentException("Type '" + enumType.Name + "' is not an enum."); + + // 鏌ヨ缂撳瓨 + var enumDic = EnumNameValueDict.ContainsKey(enumType) ? EnumNameValueDict[enumType] : new Dictionary<int, string>(); + if (enumDic.Count != 0) + return enumDic; + + // 鍙栨灇涓剧被鍨嬬殑Key/Value瀛楀吀闆嗗悎 + enumDic = GetEnumDictionaryItems(enumType); + + // 缂撳瓨 + EnumNameValueDict[enumType] = enumDic; + + return enumDic; + } + + /// <summary> + /// 鑾峰彇鏋氫妇瀵硅薄Key涓庡悕绉扮殑瀛楀吀 + /// </summary> + /// <param name="enumType"></param> + /// <returns></returns> + private static Dictionary<int, string> GetEnumDictionaryItems(this Type enumType) + { + // 鑾峰彇绫诲瀷鐨勫瓧娈碉紝鍒濆鍖栦竴涓湁闄愰暱搴︾殑瀛楀吀 + var enumFields = enumType.GetFields(BindingFlags.Public | BindingFlags.Static); + Dictionary<int, string> enumDic = new(enumFields.Length); + + // 閬嶅巻瀛楁鏁扮粍鑾峰彇key鍜宯ame + foreach (var enumField in enumFields) + { + var intValue = (int)enumField.GetValue(enumType); + enumDic[intValue] = enumField.Name; + } + + return enumDic; + } + + /// <summary> + /// 鑾峰彇鏋氫妇绫诲瀷key涓庢弿杩扮殑瀛楀吀锛堢紦瀛橈級 + /// </summary> + /// <param name="enumType"></param> + /// <returns></returns> + /// <exception cref="Exception"></exception> + public static Dictionary<int, string> GetEnumDescDictionary(this Type enumType) + { + if (!enumType.IsEnum) + throw new ArgumentException("Type '" + enumType.Name + "' is not an enum."); + + // 鏌ヨ缂撳瓨 + var enumDic = EnumDisplayValueDict.ContainsKey(enumType) + ? EnumDisplayValueDict[enumType] + : new Dictionary<int, string>(); + + if (enumDic.Count != 0) + return enumDic; + + // 鍙栨灇涓剧被鍨嬬殑Key/Value瀛楀吀闆嗗悎 + enumDic = GetEnumDescDictionaryItems(enumType); + + // 缂撳瓨 + EnumDisplayValueDict[enumType] = enumDic; + + return enumDic; + } + + /// <summary> + /// 鑾峰彇鏋氫妇绫诲瀷key涓庢弿杩扮殑瀛楀吀锛堟病鏈夋弿杩板垯鑾峰彇name锛� + /// </summary> + /// <param name="enumType"></param> + /// <returns></returns> + /// <exception cref="Exception"></exception> + private static Dictionary<int, string> GetEnumDescDictionaryItems(this Type enumType) + { + // 鑾峰彇绫诲瀷鐨勫瓧娈碉紝鍒濆鍖栦竴涓湁闄愰暱搴︾殑瀛楀吀 + var enumFields = enumType.GetFields(BindingFlags.Public | BindingFlags.Static); + Dictionary<int, string> enumDic = new(enumFields.Length); + + // 閬嶅巻瀛楁鏁扮粍鑾峰彇key鍜宯ame + foreach (var enumField in enumFields) + { + var intValue = (int)enumField.GetValue(enumType); + var desc = enumField.GetCustomAttribute<DescriptionAttribute>(); + enumDic[intValue] = desc != null && !string.IsNullOrEmpty(desc.Description) ? desc.Description : enumField.Name; + } + + return enumDic; + } + + /// <summary> + /// 浠庣▼搴忛泦涓煡鎵炬寚瀹氭灇涓剧被鍨� + /// </summary> + /// <param name="assembly"></param> + /// <param name="typeName"></param> + /// <returns></returns> + public static Type TryToGetEnumType(Assembly assembly, string typeName) + { + // 鏋氫妇缂撳瓨涓虹┖鍒欓噸鏂板姞杞芥灇涓剧被鍨嬪瓧鍏� + _enumTypeDict ??= LoadEnumTypeDict(assembly); + + // 鎸夊悕绉版煡鎵� + return _enumTypeDict.ContainsKey(typeName) ? _enumTypeDict[typeName] : null; + } + + /// <summary> + /// 浠庣▼搴忛泦涓姞杞芥墍鏈夋灇涓剧被鍨� + /// </summary> + /// <param name="assembly"></param> + /// <returns></returns> + private static ConcurrentDictionary<string, Type> LoadEnumTypeDict(Assembly assembly) + { + // 鍙栫▼搴忛泦涓墍鏈夌被鍨� + var typeArray = assembly.GetTypes(); + + // 杩囨护闈炴灇涓剧被鍨嬶紝杞垚瀛楀吀鏍煎紡骞惰繑鍥� + var dict = typeArray.Where(o => o.IsEnum).ToDictionary(o => o.Name, o => o); + ConcurrentDictionary<string, Type> enumTypeDict = new(dict); + return enumTypeDict; + } + + /// <summary> + /// 鑾峰彇鏋氫妇鐨凞escription + /// </summary> + /// <param name="value"></param> + /// <returns></returns> + public static string GetDescription<T>(this T value) where T : Enum + { + return GetEnumDescDictionary(typeof(T))[value.GetHashCode()]; + } + + /// <summary> + /// 鑾峰彇鏋氫妇鐨凞escription + /// </summary> + /// <param name="value"></param> + /// <returns></returns> + public static string GetDescription(this object value) + { + return value.GetType().GetMember(value.ToString() ?? string.Empty).FirstOrDefault() + ?.GetCustomAttribute<DescriptionAttribute>()?.Description; + } + + /// <summary> + /// 灏嗘灇涓捐浆鎴愭灇涓句俊鎭泦鍚� + /// </summary> + /// <param name="type"></param> + /// <returns></returns> + public static List<EnumEntity> EnumToList(this Type type) + { + if (!type.IsEnum) + throw new ArgumentException("Type '" + type.Name + "' is not an enum."); + + var arr = System.Enum.GetNames(type); + return arr.Select(sl => + { + var item = System.Enum.Parse(type, sl); + return new EnumEntity + { + Name = item.ToString(), + Describe = item.GetDescription() ?? item.ToString(), + Value = (int)item + }; + }).ToList(); + } + + /// <summary> + /// 灏嗘灇涓捐浆鎴愭灇涓句俊鎭泦鍚� + /// </summary> + /// <param name="type"></param> + /// <returns></returns> + public static List<EnumEntity<T>> EnumToList<T>(this Type type) + { + if (!type.IsEnum) + throw new ArgumentException("Type '" + type.Name + "' is not an enum."); + + var arr = System.Enum.GetNames(type); + return arr.Select(sl => + { + var item = System.Enum.Parse(type, sl); + return new EnumEntity<T> + { + Name = item.ToString(), + Describe = item.GetDescription() ?? item.ToString(), + Value = (T)item + }; + }).ToList(); + } + + /// <summary> + /// 鏋氫妇ToList + /// </summary> + /// <typeparam name="T"></typeparam> + /// <param name="type"></param> + /// <returns></returns> + public static List<T> EnumToEnumList<T>(this Type type) + { + if (!type.IsEnum) + throw new ArgumentException("Type '" + type.Name + "' is not an enum."); + + var arr = System.Enum.GetNames(type); + return arr.Select(name => (T)System.Enum.Parse(type, name)).ToList(); + } + + /// <summary> + /// 鏄惁鏄灇涓句腑鐨勫�� + /// </summary> + /// <param name="value"></param> + /// <returns></returns> + public static bool IsEnumValue(this Enum value) + { + return Enum.IsDefined(value.GetType(), value); + } +} + +/// <summary> +/// 鏋氫妇瀹炰綋 +/// </summary> +public class EnumEntity<T> +{ + /// <summary> + /// 鏋氫妇鐨勬弿杩� + /// </summary> + public string Describe { set; get; } + + /// <summary> + /// 鏋氫妇鍚嶇О + /// </summary> + public string Name { set; get; } + + /// <summary> + /// 鏋氫妇瀵硅薄鐨勫�� + /// </summary> + public T Value { set; get; } +} + +/// <summary> +/// 鏋氫妇瀹炰綋 +/// </summary> +public class EnumEntity : EnumEntity<int> +{ + +} + +/// <summary> +/// 鍖呭惈鏋氫妇绫诲瀷鐨勬灇涓句俊鎭� +/// </summary> +public class EnumEntityAndEnumType<T> +{ + /// <summary> + /// 鏋氫妇绫诲瀷鍚嶇О + /// </summary> + public string EnumName { get; set; } + + /// <summary> + /// 鏋氫妇鍊兼槑缁� + /// </summary> + public List<EnumEntity<T>> EnumEntitiy { get; set; } +} + +/// <summary> +/// 鍖呭惈鏋氫妇绫诲瀷鐨勬灇涓句俊鎭� +/// </summary> +public class EnumEntityAndEnumType : EnumEntityAndEnumType<int> +{ + +} \ No newline at end of file diff --git a/LifePayment/LifePayment.Domain.Shared/Extension/IQueryableExtensions.cs b/LifePayment/LifePayment.Domain.Shared/Extension/IQueryableExtensions.cs new file mode 100644 index 0000000..3f70e67 --- /dev/null +++ b/LifePayment/LifePayment.Domain.Shared/Extension/IQueryableExtensions.cs @@ -0,0 +1,43 @@ +锘縰sing Microsoft.EntityFrameworkCore; +using System; +using System.Linq; +using System.Linq.Expressions; + +namespace LifePayment.Domain.Shared; + +public static class IQueryableExtensions +{ + /// <summary> + /// 褰撴潯浠朵负true鏃朵负IQueryable闄勫姞where锛屾敞锛氬鏋滄潯浠朵负true浼氭洿鏂皊ource + /// </summary> + /// <typeparam name="T"></typeparam> + /// <param name="source"></param> + /// <param name="condition"></param> + /// <param name="wherePredicate"></param> + /// <returns></returns> + public static IQueryable<T> WhereIfWithUpdateSource<T>(this IQueryable<T> source, bool condition, Expression<Func<T, bool>> wherePredicate) + { + if (condition) + source = source.Where(wherePredicate); + + return source; + } + + /// <summary> + /// 褰撴潯浠朵负true鏃朵负IQueryable闄勫姞include锛屾敞锛氬鏋滄潯浠朵负true浼氭洿鏂皊ource + /// </summary> + /// <typeparam name="T"></typeparam> + /// <typeparam name="TP"></typeparam> + /// <param name="source"></param> + /// <param name="condition"></param> + /// <param name="navigationPropertyPath"></param> + /// <returns></returns> + public static IQueryable<T> IncludeIf<T, TP>(this IQueryable<T> source, bool condition, Expression<Func<T, TP>> navigationPropertyPath) where T : class + { + if (condition) + source = source.Include(navigationPropertyPath); + + return source; + } +} + diff --git a/LifePayment/LifePayment.Domain.Shared/Extension/ListExtensions.cs b/LifePayment/LifePayment.Domain.Shared/Extension/ListExtensions.cs new file mode 100644 index 0000000..da9704a --- /dev/null +++ b/LifePayment/LifePayment.Domain.Shared/Extension/ListExtensions.cs @@ -0,0 +1,141 @@ +锘縰sing System; +using System.Collections; +using System.Collections.Generic; +using System.Threading.Tasks; + +namespace LifePayment.Domain.Shared; + +/// <summary> +/// 闆嗗悎鎵╁睍 +/// </summary> +public static class ListExtensions +{ + /// <summary> + /// 寮傛寰幆 + /// </summary> + /// <typeparam name="T"></typeparam> + /// <param name="list"></param> + /// <param name="func"></param> + /// <returns></returns> + public static async Task ForEachAsync<T>(this List<T> list, Func<T, Task> action) + { + foreach (var value in list) + { + await action(value); + } + } + + /// <summary> + /// 寮傛寰幆 + /// </summary> + /// <typeparam name="T"></typeparam> + /// <param name="source"></param> + /// <param name="action"></param> + /// <returns></returns> + public static async Task ForEachAsync<T>(this IEnumerable<T> source, Func<T, Task> action) + { + foreach (var value in source) + { + await action(value); + } + } + + /// <summary> + /// 鏄惁涓簄ull鎴栫┖闆嗗悎 + /// </summary> + /// <param name="source"></param> + /// <returns></returns> + public static bool IsNullOrEmpty(this IEnumerable source) + { + return (source == null || !source.HasItems()); + } + + /// <summary> + /// 鏄惁涓嶄负null鎴栫┖闆嗗悎 + /// </summary> + /// <param name="source"></param> + /// <returns></returns> + public static bool IsNotNullOrEmpty(this IEnumerable source) + { + return !IsNullOrEmpty(source); + } + + /// <summary> + /// 鏄惁鏈夊厓绱� + /// </summary> + /// <param name="source"></param> + /// <returns></returns> + public static bool HasItems(this IEnumerable source) + { + return source != null && source.GetEnumerator().MoveNext(); + } + + ///// <summary> + ///// 鏍规嵁鎸囧畾闂撮殧瀛楃灏嗛泦鍚堝悎骞朵负瀛楃涓� + ///// </summary> + ///// <param name="source"></param> + ///// <param name="separator"></param> + ///// <returns></returns> + //public static string JoinAsString(this IEnumerable<string> source, string separator) + //{ + // return string.Join(separator, source); + //} + + /// <summary> + /// 鏍规嵁鎸囧畾闂撮殧瀛楃灏嗛泦鍚堝悎骞朵负瀛楃涓� + /// </summary> + /// <typeparam name="T"></typeparam> + /// <param name="source"></param> + /// <param name="separator"></param> + /// <returns></returns> + public static string JoinAsString<T>(this IEnumerable<T> source, string separator) + { + return string.Join(separator, source); + } + + /// <summary> + /// ICollection鎵归噺娣诲姞鍏冪礌 + /// </summary> + /// <typeparam name="T"></typeparam> + /// <param name="collection"></param> + /// <param name="items"></param> + /// <exception cref="ArgumentNullException"></exception> + public static void AddRange<T>(this ICollection<T> collection, IEnumerable<T> items) + { + if (collection == null) + throw new ArgumentNullException(nameof(collection)); + + if (items == null) + throw new ArgumentNullException(nameof(items)); + + if (collection is List<T> list) + { + list.AddRange(items); + } + else + { + foreach (var item in items) + { + collection.Add(item); + } + } + } + + /// <summary> + /// 杞崲涓哄�间负object绫诲瀷鐨勫瓧鍏� + /// </summary> + /// <typeparam name="TK"></typeparam> + /// <typeparam name="TV"></typeparam> + /// <param name="resource"></param> + /// <returns></returns> + public static Dictionary<TK, object> ToObjectDic<TK, TV>(this IDictionary<TK, TV> resource) where TV : class + { + var result = new Dictionary<TK, object>(); + foreach (var item in resource) + { + result.Add(item.Key, (object)item.Value); + } + return result; + } +} + diff --git a/LifePayment/LifePayment.Domain.Shared/Information/InformationOption.cs b/LifePayment/LifePayment.Domain.Shared/Information/InformationOption.cs new file mode 100644 index 0000000..6d85ad9 --- /dev/null +++ b/LifePayment/LifePayment.Domain.Shared/Information/InformationOption.cs @@ -0,0 +1,20 @@ +锘縰sing System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace LifePayment.Domain.Shared +{ + public class InformationOption + { + /// <summary> + /// 璇锋眰鍦板潃 + /// </summary> + public string RequestUrl { get; set; } + + public string AppId { get; set; } + + public string AppSecret { get; set; } + } +} diff --git a/LifePayment/LifePayment.Domain.Shared/LifePaymentConstant.cs b/LifePayment/LifePayment.Domain.Shared/LifePaymentConstant.cs index c4345ea..f7252d6 100644 --- a/LifePayment/LifePayment.Domain.Shared/LifePaymentConstant.cs +++ b/LifePayment/LifePayment.Domain.Shared/LifePaymentConstant.cs @@ -31,6 +31,8 @@ public const string 寰俊灏忕▼搴忚韩浠戒細璇濅俊鎭� = "/sns/jscode2session?grant_type=authorization_code&appid={0}&secret={1}&js_code={2}"; + public const string 寰俊鍏紬鍙疯幏鍙朼ccess_token = "/sns/oauth2/access_token?appid={0}&secret={1}&code={2}&grant_type=authorization_code"; + public const string PhoneMessageName = "PhoneMessage"; public const string SMStemplate404 = "鏈壘鍒拌鐭俊妯℃澘"; @@ -45,7 +47,11 @@ public const string PayTransactionsNative = "/v3/pay/transactions/native"; + public const string PayJsApi = "/v3/pay/transactions/jsapi"; + public const string PayTransactions = "/v3/pay/transactions"; + + public const string PayTransactionsH5 = "/v3/pay/transactions/h5"; public const string WxRechargeNotifySectionUrl = "/api/WxPayNotify/WxRechargeNotify"; @@ -69,6 +75,22 @@ } + public static class CategoryName + { + public const string 琛屼笟璧勮 = "琛屼笟璧勮"; + + public const string 鍗撶帴瀛︾ぞ = "鍗撶帴瀛︾ぞ"; + + } + + public static class CooperApplyType + { + public const string 骞冲彴鍚堜綔 = "骞冲彴鍚堜綔"; + public const string 琛屼笟璧勮 = "琛屼笟璧勮"; + + public const string 琛屼笟璧勮鍚堜綔 = "琛屼笟璧勮鍚堜綔"; + + } public static class UserType { @@ -124,12 +146,162 @@ } + public static class OperateType + { + public static int 骞冲彴鑷惀 = 1; + + public static int 瀹㈡埛鑷惀 = 2; + + public static int 閲囬泦 = 3; + } + + public static class ProductStatus + { + public static int 宸蹭笅鏋� = -20; + + public static int 椹冲洖 = -10; + + public static int 淇濆瓨 = -1; + + public static int 鎻愪氦寰呭鏍� = 0; + + public static int 閫氳繃 = 10; + } + + /// <summary> + /// -20 椹冲洖 1鍒濆鐘舵�� 10鏈彁浜� 20寰呭鏍� 30 杩涜涓� 40 涓嬫灦 50 绯荤粺涓嬫灦 + /// </summary> + public static class ParkOrHrStatus + { + /// <summary> + /// 鍒濆鐘舵�� + /// </summary> + public static int Init = 1; + + /// <summary> + /// 0 鏈紑閫� + /// </summary> + public static int NotOpen = 0; + + /// <summary> + /// 10 鑽夌 + /// </summary> + public static int ToBeReviewed = 10; + + /// <summary> + /// 20 鍔炵悊涓� + /// </summary> + public static int Conducting = 20; + + /// <summary> + /// 30閫氳繃 + /// </summary> + public static int Pass = 30; + + /// <summary> + /// -20 椹冲洖 + /// </summary> + public static int Reject = -20; + + /// <summary> + /// 涓嬫灦 + /// </summary> + public static int OffShelf = 40; + + /// <summary> + /// 绯荤粺涓嬫灦 + /// </summary> + public static int SystemOffShelf = 50; + + + } + public static class AdvertiseStatus + { + public static int 涓嬫灦 = -10; + + public static int 鎻愪氦 = 0; + + public static int 涓婃灦 = 10; + } + + public static class InformationStatus + { + /// <summary> + /// (宸插簾寮�) + /// </summary> + public static int 宸蹭笅鏋� = -20; + + public static int 椹冲洖 = -10; + + /// <summary> + /// (宸插簾寮�) + /// </summary> + public static int 淇濆瓨 = -1; + + public static int 鎻愪氦寰呭鏍� = 0; + + public static int 鎺ユ敹寰呴噰鐢� = 1;// 浠呴噰闆嗙殑璧勮 + + public static int 閫氳繃 = 10; + } + + public static class InformationIntroInfoType + { + /// <summary> + /// 鏂囨湰 + /// </summary> + public static int Text = 0; + + /// <summary> + /// 鍥剧墖 + /// </summary> + public static int Pic = 1; + + /// <summary> + /// 瑙嗛 + /// </summary> + public static int Video = 2; + + /// <summary> + /// 瀵屾枃鏈� + /// </summary> + public static int RichText = 3; + + /// <summary> + /// 寰俊鐨勫唴瀹� + /// </summary> + public static int WXContent = 4; + } + + public static class InformationDefault + { + public const string DefaultCoverUrl = "https://parkmanagement.oss-cn-hangzhou.aliyuncs.com/12333/assets/icon-default-cover.png"; + + public const string DefaultAuthor = "浣氬悕"; + + } public static class ImplementAreaType { public static int 鍏ㄥ浗 = 0; public static int 鐪佷唤 = 1; + } + + public static class AdvertisePriceStatus + { + public static int 宸蹭笅鏋� = -10; + + public static int 鏄剧ず涓� = 10; + } + + public static class UserWithdrawStatus + { + public static int 椹冲洖 = -10; + + public static int 鎵撴涓� = 10; + + public static int 宸插畬鎴� = 20; } public static class PeriodType @@ -145,6 +317,15 @@ public static int 骞� = 365; } + public static class CommentStatus + { + public static int 椹冲洖 = -10; + + public static int 鎻愪氦寰呭鏍� = 0; + + public static int 閫氳繃 = 10; + } + public static class WxMiniAppLoginStatus { public static int 鐧诲綍杩囨湡 = -10; @@ -154,12 +335,294 @@ public static int 鐧诲綍纭 = 10; } + public static class PurchasedProductStatus + { + public static int 鐢宠閫�娆鹃┏鍥� = -30; + + public static int 閫�娆炬垚鍔� = -20; + + public static int 鐢宠閫�娆� = -10; + + public static int 寰呯‘璁ら獙鏀� = 0; + + public static int 纭楠屾敹 = 10; + + public static int 浜ゆ槗瀹屾垚 = 20; + } + + public static class AdvertisePayType + { + public static int 浠樿垂 = 0; + + public static int 鍏嶈垂 = 1; + } + + public static class InformationApplyStatus + { + public static int 鎶ュ悕涓� = 0; + + public static int 杩涜涓� = 10; + + public static int 宸茬粨鏉� = 20; + } public static class AmountTransferOIType { public static int 鏀嚭 = -1; public static int 鏀跺叆 = 1; + } + + public static class AmountTransferType + { + public static int 浜у搧閫�娆� = -1; + + public static int 浜у搧璐拱 = 1; + + public static int 璧勮鎵撹祻 = 2; + + public static int 浜у搧骞垮憡鎶曟斁 = 3; + + public static int 璧勮骞垮憡鎶曟斁 = 4; + } + + public static class RechargeStatus + { + public const int 鑾峰彇鍏呭�肩爜澶辫触 = -100; + + public const int 鏀粯澶辫触 = -40; + + public const int 杞叆閫�娆� = -30; + + public const int 宸叉挙閿� = -20; + + public const int 浜ゆ槗鍏抽棴 = -10; + + public const int 鏈敮浠� = 0; + + public const int 鏀粯涓� = 10; + + public const int 鏀粯鎴愬姛 = 20; + + public const int 浜ゆ槗缁撴潫 = 30; + } + + public static class WxPayStatus + { + public const string 鏀粯澶辫触 = "PAYERROR"; + + public const string 杞叆閫�娆� = "REFUND"; + + public const string 宸叉挙閿� = "REVOKED"; + + public const string 浜ゆ槗鍏抽棴 = "CLOSED"; + + public const string 鏈敮浠� = "NOTPAY"; + + public const string 鏀粯涓� = "USERPAYING"; + + public const string 鏀粯鎴愬姛 = "SUCCESS"; + } + public static class ThumbsUpStatus + { + public const int 鍙栨秷 = 0; + + public const int 鐐硅禐 = 1; + } + + public static class TagsType + { + //public const int 浜у搧 = 0; + //public const int 璧勮 = 1; + public const int 鏅�� = 1; + public const int 鑷畾涔� = 2; + public const int 浜у搧蹇嵎璇勪环 = 3; + } + + public static class RechargeType + { + public const int 寰俊 = 10; + + public const int 鏀粯瀹� = 20; + + public const int 绾夸笅 = 30; + } + + public static class MessageType + { + public const int 浜у搧鍏虫敞 = 1; + public const int 浜у搧浠樻 = 2; + public const int 璧勮鎵撹祻 = 3; + public const int 浜у搧楠屾敹 = 4; + public const int 浜у搧璇勪环 = 5; + public const int 浜у搧閫�娆� = 6; + public const int 瀹炲悕璁よ瘉瀹℃牳閫氳繃鏃犻渶寮�绁� = 7; + public const int 瀹炲悕璁よ瘉瀹℃牳閫氳繃闇�瑕佸紑绁� = 8; + public const int 瀹炲悕璁よ瘉瀹℃牳涓嶉�氳繃 = 9; + public const int 瀹炲悕璁よ瘉鍙戠エ宸插紑鍏� = 10; + public const int 瀹炲悕璁よ瘉鍗冲皢鍒版湡 = 11; + public const int 鐢ㄦ埛璁よ瘉澶辨晥 = 12; + public const int 鎶曚繚鎴愬姛 = 13; + public const int 鎶曚繚澶辫触 = 14; + public const int 浜哄憳鎵瑰 = 15; + public const int 鎵归噺閫�淇� = 16; + public const int 淇濋櫓鍗冲皢鍒版湡 = 17; + public const int 閽卞寘寮�鎴� = 18; + public const int 瀵瑰崟杞处鎴愬姛 = 19; + public const int 瀵瑰崟杞处瀹℃牳鏈�氳繃 = 20; + public const int 瀵瑰崟杞处澶辫触 = 21; + public const int 閽卞寘鍏呭�兼垚鍔� = 22; + public const int 閽卞寘鍏呭�煎け璐� = 23; + public const int 鎵归噺杞处鎴愬姛 = 24; + public const int 鎵归噺杞处瀹℃牳鏈�氳繃 = 25; + public const int 鎵归噺杞处澶辫触 = 26; + public const int 鎵f鎻愰啋 = 40; + public const int 鎴戞湁浜哄鏍告湭閫氳繃 = 50; + public const int 鎴戞湁璁㈠崟瀹℃牳鏈�氳繃 = 60; + public const int 鎴戞湁璁㈠崟鐢宠 = 61; + public const int 涔欐柟鏀跺埌鍗忚纭閭�璇� = 70; + public const int 鐢叉柟鏀跺埌鍗忚绛剧害閭�璇� = 71; + public const int 鍚堝悓绛剧害鎴愬姛 = 72; + public const int 鍚堝悓绛剧害澶辫触 = 73; + public const int 鐢叉柟鍒版湡鏀粯鎻愰啋 = 74; + public const int 涔欐柟纭璐圭敤鏄庣粏鎻愰啋 = 75; + public const int 涔欐柟涓婁紶鍙戠エ鎻愰啋 = 76; + public const int 鐢叉柟纭鍙戠エ鎻愰啋 = 77; + public const int 涔欐柟鍙戣柂鎻愰啋 = 78; + public const int 鐢叉柟涓婁紶璐圭敤鏄庣粏鎻愰啋 = 79; + public const int 绾夸笅鏀粯瀹℃牳鎴愬姛 = 80; + public const int 绾夸笅鏀粯瀹℃牳鏈�氳繃 = 87; + public const int 鎶曚繚鎵瑰崟瀹℃牳閫氳繃 = 81; + public const int 鎶曚繚鎵瑰崟瀹℃牳椹冲洖 = 82; + public const int 鎶曚繚鎵瑰崟鎴愬姛 = 83; + public const int 鎶曚繚鎵瑰崟鏀粯澶辫触 = 84; + public const int 鎶曚繚瀹℃牳鎴愬姛 = 85; + public const int 鎶曚繚瀹℃牳澶辫触 = 86; + public const int 鎶曚繚鏀粯澶辫触 = 88; + } + + public static class AliPayStatus + { + public const string 瓒呮椂鍏抽棴 = "TRADE_CLOSED"; + + public const string 绛夊緟浠樻 = "WAIT_BUYER_PAY"; + + public const string 鏀粯鎴愬姛 = "TRADE_SUCCESS"; + + public const string 浜ゆ槗缁撴潫 = "TRADE_FINISHED"; + } + + public static class AlipayOrderStatus + { + public const string 閫�绁� = "REFUND"; + + public const string 澶勭悊涓� = "DEALING"; + + public const string 鏀粯鎴愬姛 = "SUCCESS"; + + public const string 鏀粯澶辫触 = "FAIL"; + } + + public static Dictionary<string, int> AliPayStatusDic = new Dictionary<string, int>() + { + { AliPayStatus.瓒呮椂鍏抽棴, RechargeStatus.浜ゆ槗鍏抽棴 }, + { AliPayStatus.绛夊緟浠樻, RechargeStatus.鏀粯涓� }, + { AliPayStatus.鏀粯鎴愬姛, RechargeStatus.鏀粯鎴愬姛 }, + { AliPayStatus.浜ゆ槗缁撴潫, RechargeStatus.浜ゆ槗缁撴潫 }, + }; + + public static Dictionary<string, int> WxPayStatusDic = new Dictionary<string, int>() + { + { WxPayStatus.鏀粯澶辫触, RechargeStatus.鏀粯澶辫触 }, + { WxPayStatus.杞叆閫�娆�, RechargeStatus.杞叆閫�娆� }, + { WxPayStatus.宸叉挙閿�, RechargeStatus.宸叉挙閿� }, + { WxPayStatus.浜ゆ槗鍏抽棴, RechargeStatus.浜ゆ槗鍏抽棴 }, + { WxPayStatus.鏈敮浠�, RechargeStatus.鏈敮浠� }, + { WxPayStatus.鏀粯涓�, RechargeStatus.鏀粯涓� }, + { WxPayStatus.鏀粯鎴愬姛, RechargeStatus.鏀粯鎴愬姛 }, + }; + + + public static Dictionary<int, string> MessageDic = new Dictionary<int, string>() + { + { MessageType.浜у搧鍏虫敞, "銆恵0}銆戠敤鎴穥1}鏂板叧娉ㄤ簡浣犵殑銆恵2}銆憑3}" }, + { MessageType.浜у搧浠樻,"銆恵0}銆戠敤鎴穥1}鏂拌喘涔颁簡浣犵殑銆恵2}銆憑3}" }, + { MessageType.璧勮鎵撹祻, "銆恵0}銆戠敤鎴穥1}鎵撹祻浜嗕綘{2}銆恵3}銆憑4}" }, + { MessageType.浜у搧楠屾敹,"銆恵0}銆戠敤鎴穥1}纭楠屾敹浜嗕綘鐨勪骇鍝併�恵2}銆憑3}" }, + { MessageType.浜у搧璇勪环, "銆恵0}銆戠敤鎴穥1}璇勪环浜嗕綘鐨勪骇鍝併�恵2}銆憑3}" }, + { MessageType.浜у搧閫�娆�,"銆恵0}銆戠敤鎴穥1}鐢宠閫�娆句簡浣犵殑浜у搧銆恵2}銆憑3}" }, + { MessageType.瀹炲悕璁よ瘉瀹℃牳閫氳繃鏃犻渶寮�绁�,"銆恵0}銆戞偍鎻愪氦鐨剓1}浼佷笟瀹炲悕淇℃伅宸查�氳繃瀹℃牳銆�" }, + { MessageType.瀹炲悕璁よ瘉瀹℃牳閫氳繃闇�瑕佸紑绁�,"銆恵0}銆戞偍鎻愪氦鐨剓1}浼佷笟瀹炲悕淇℃伅宸查�氳繃瀹℃牳锛屽钩鍙板皢鍦�7涓伐浣滄棩鍐呭紑鍏疯璇佹湇鍔¤垂鍙戠エ銆�" }, + { MessageType.瀹炲悕璁よ瘉瀹℃牳涓嶉�氳繃,"銆恵0}銆戞偍鎻愪氦鐨剓1}浼佷笟瀹炲悕淇℃伅瀹℃牳鏈�氳繃銆傛湭閫氳繃鐞嗙敱锛歿2}銆�" }, + { MessageType.瀹炲悕璁よ瘉鍙戠エ宸插紑鍏�,"銆恵0}銆戞偍鎻愪氦鐨剓1}浼佷笟瀹炲悕璁よ瘉鏈嶅姟璐瑰彂绁ㄥ凡寮�鍏枫��" }, + { MessageType.瀹炲悕璁よ瘉鍗冲皢鍒版湡,"銆恵0}銆戞偍鎻愪氦鐨剓1}浼佷笟瀹炲悕璁よ瘉宸茶繘鍏ュ勾瀹℃湡锛屼负浜嗕繚璇佹偍璐﹀彿鐨勬甯镐娇鐢紝璇蜂簬{2}鍓嶅畬鎴愬勾瀹°��" }, + { MessageType.鐢ㄦ埛璁よ瘉澶辨晥,"銆恵0}銆戞偍鐨剓1}浼佷笟瀹炲悕淇℃伅宸插け鏁堛��" }, + { MessageType.鎶曚繚鎴愬姛,"銆愪繚闄┿�戞偍濂斤紝{0}鍒涘缓鎶曚繚缂栧彿锛歿1}鐨剓2}鎶曚繚鎴愬姛锛�" }, + { MessageType.鎶曚繚澶辫触,"銆愪繚闄┿�戞偍濂斤紝{0}鍒涘缓鎶曚繚缂栧彿锛歿1}鐨剓2}宸叉姇淇濆け璐ワ紝" }, + { MessageType.浜哄憳鎵瑰,"銆愪繚闄┿�戞偍濂斤紝{0}鍒涘缓鎶曚繚缂栧彿锛歿1}鐨剓2}{3}浜簕4}銆�" }, + { MessageType.鎵归噺閫�淇�,"銆愪繚闄┿�戞偍濂斤紝{0}鍒涘缓鎶曚繚缂栧彿锛歿1}鐨剓2}{3}浜簕4}銆�" }, + { MessageType.淇濋櫓鍗冲皢鍒版湡,"銆愪繚闄┿�戞偍濂斤紝鎶曚繚缂栧彿锛歿0}鐨剓1}{2}澶╁悗鍗冲皢鍒版湡锛岃鎮ㄥ強鏃舵姇淇濄��" }, + { MessageType.閽卞寘寮�鎴�,"鎮ㄧ殑{0}閽卞寘宸插紑閫氾紝" }, + { MessageType.瀵瑰崟杞处鎴愬姛,"浜ゆ槗娴佹按鍙凤細{0}锛屽凡鏀粯鎴愬姛" }, + { MessageType.瀵瑰崟杞处瀹℃牳鏈�氳繃,"浜ゆ槗娴佹按鍙凤細{0}锛屼粯娆惧鏍告湭閫氳繃锛屽師鍥狅細{1}" }, + { MessageType.瀵瑰崟杞处澶辫触,"浜ゆ槗娴佹按鍙凤細{0}锛屼粯娆惧け璐ワ紝鍘熷洜锛歿1}" }, + { MessageType.鎵归噺杞处鎴愬姛,"鎵规鍙凤細{0}锛屽凡鏀粯鎴愬姛" }, + { MessageType.鎵归噺杞处瀹℃牳鏈�氳繃,"鎵规鍙凤細{0}锛屼粯娆惧鏍告湭閫氳繃锛屽師鍥狅細{1}" }, + { MessageType.鎵归噺杞处澶辫触,"鎵规鍙凤細{0}锛屼粯娆惧け璐ワ紝鍘熷洜锛歿1}" }, + { MessageType.绾夸笅鏀粯瀹℃牳鎴愬姛,"浜ゆ槗娴佹按鍙凤細{0}锛屾偍鐨勭嚎涓嬫敮浠樿姹傚鏍稿凡閫氳繃" }, + { MessageType.绾夸笅鏀粯瀹℃牳鏈�氳繃,"浜ゆ槗娴佹按鍙凤細{0}锛屾偍鐨勭嚎涓嬫敮浠樿姹傚鏍告湭閫氳繃" }, + { MessageType.鎵f鎻愰啋,"銆愪繚闄┿�戞偍濂斤紝{0}鍒涘缓鎶曚繚缂栧彿锛歿1}鐨剓2}涓婁紶{3}浜烘姇淇濇垚鍔燂紝瀹為檯鍙姇淇漿4}浜�,淇濊垂锛歿5}鍏冿紝璇风‘淇濊处鍙蜂綑棰濆厖瓒筹紝" }, + { MessageType.閽卞寘鍏呭�兼垚鍔�,"鍏呭�兼祦姘村彿锛歿0}锛屽凡鍏呭�兼垚鍔�" }, + { MessageType.閽卞寘鍏呭�煎け璐�,"鍏呭�兼祦姘村彿锛歿0}锛屽厖鍊煎け璐ワ紝鍘熷洜锛歿1}" }, + { MessageType.鎴戞湁浜哄鏍告湭閫氳繃,"銆愭垜鏈変汉銆戞偍鍙戝竷鐨剓0}淇℃伅瀹℃牳鏈�氳繃锛�" }, + { MessageType.鎴戞湁璁㈠崟瀹℃牳鏈�氳繃,"銆愭垜鏈夎鍗曘�戞偍鍙戝竷鐨剓0}淇℃伅瀹℃牳鏈�氳繃锛�" }, + { MessageType.鎴戞湁璁㈠崟鐢宠,"銆愭垜鏈夎鍗曘�戞偍鍙戝竷鐨剓0}锛屾敹鍒颁竴鏉$敵璇凤紝" }, + { MessageType.涔欐柟鏀跺埌鍗忚纭閭�璇�,"鎮ㄦ湁涓�鏉″悎浣滈個绾︼紝" }, + { MessageType.鐢叉柟鏀跺埌鍗忚绛剧害閭�璇�,"鍚堝悓鍙凤細{0}锛屽緟鎮ㄧ绾︼紝" }, + { MessageType.鍚堝悓绛剧害鎴愬姛,"鍚堝悓鍙凤細{0}锛屽凡绛剧害鎴愬姛銆�" }, + { MessageType.鍚堝悓绛剧害澶辫触,"鍚堝悓鍙凤細{0}锛屽凡绛剧害澶辫触锛屽け璐ュ師鍥狅細{1}" }, + { MessageType.鐢叉柟鍒版湡鏀粯鎻愰啋,"鍚堝悓鍙凤細{0}锛屽緟鎮ㄤ粯娆撅紝" }, + { MessageType.涔欐柟纭璐圭敤鏄庣粏鎻愰啋,"鍚堝悓鍙凤細{0}锛岃垂鐢ㄦ槑缁嗗緟纭锛�" }, + { MessageType.涔欐柟涓婁紶鍙戠エ鎻愰啋,"鍚堝悓鍙凤細{0}锛屽彂绁ㄤ俊鎭緟涓婁紶锛�" }, + { MessageType.鐢叉柟涓婁紶璐圭敤鏄庣粏鎻愰啋,"鍚堝悓鍙凤細{0}锛岃垂鐢ㄦ槑缁嗗緟涓婁紶锛�" }, + { MessageType.鐢叉柟纭鍙戠エ鎻愰啋,"鍚堝悓鍙凤細{0}锛屽彂绁ㄤ俊鎭緟纭锛�" }, + { MessageType.涔欐柟鍙戣柂鎻愰啋,"鍚堝悓鍙凤細{0}锛屽緟鎮ㄥ彂钖紝" }, + { MessageType.鎶曚繚鎵瑰崟瀹℃牳閫氳繃,"銆愪繚闄┿�戞偍濂斤紝{0}鍒涘缓鎵瑰崟缂栧彿锛歿1}鐨剓2}瀹℃牳閫氳繃锛�" }, + { MessageType.鎶曚繚鎵瑰崟瀹℃牳椹冲洖,"銆愪繚闄┿�戞偍濂斤紝{0}鍒涘缓鎵瑰崟缂栧彿锛歿1}鐨剓2}瀹℃牳椹冲洖锛�" }, + { MessageType.鎶曚繚鎵瑰崟鎴愬姛,"銆愪繚闄┿�戞偍濂斤紝{0}鍒涘缓鎶曚繚缂栧彿锛歿1}鐨剓2}鎵瑰崟鎴愬姛锛�" }, + { MessageType.鎶曚繚鎵瑰崟鏀粯澶辫触,"銆愪繚闄┿�戞偍濂斤紝{0}鍒涘缓鎵瑰崟缂栧彿锛歿1}鐨剓2}鏀粯澶辫触锛�" }, + { MessageType.鎶曚繚瀹℃牳鎴愬姛,"銆愪繚闄┿�戞偍濂斤紝{0}鍒涘缓鎶曚繚缂栧彿锛歿1}鐨剓2}瀹℃牳閫氳繃锛�" }, + { MessageType.鎶曚繚瀹℃牳澶辫触,"銆愪繚闄┿�戞偍濂斤紝{0}鍒涘缓鎶曚繚缂栧彿锛歿1}鐨剓2}瀹℃牳椹冲洖锛�" }, + { MessageType.鎶曚繚鏀粯澶辫触,"銆愪繚闄┿�戞偍濂斤紝{0}鍒涘缓鎶曚繚缂栧彿锛歿1}鐨剓2}鏀粯澶辫触锛�" }, + }; + + public static class OrderStatus + { + /// <summary> + /// 10鑽夌 + /// </summary> + public const int Draft = 10; + + /// <summary> + /// 20寰呭鏍� + /// </summary> + public const int PendingReview = 20; + + /// <summary> + /// 杩涜涓� + /// </summary> + public const int Processing = 30; + + /// <summary> + /// 涓嬫灦 + /// </summary> + public const int OffShelf = 40; + + + public const int SystemOffShelf = 50; + + + public const int Reject = -10; } public static class Squence @@ -184,6 +647,13 @@ public static int LatestWeek = 20; public static int LatestMonth = 30; + } + + public static class ResourceCityType + { + public static int 鎵�鍦ㄥ煄甯� = 0; + + public static int 鎰忓悜杈撻�佸煄甯� = 1; } public static class TableType @@ -253,6 +723,8 @@ public const int LgGigWorkerCustomerTemplate = 146; public const int LgGigWorkerSignFreeSetting = 151; + + public const int LifePayOrder = 200; } public static class LogsSpecies @@ -323,44 +795,210 @@ public static string UserRegister = "娉ㄥ唽"; + public static string ParkOrHRPublish = "浜鸿祫鍏徃鍙戝竷"; + public static string ParkOrHRAdminProxyPublish = "浜鸿祫鍏徃浠e彂"; public static string Setting = "閰嶇疆"; + + #region 閽卞寘鏃ュ織 + + public static string ApplyBankWalletAccountOpen = "鎻愪氦寮�鎴风敵璇�"; + + public static string SetBankWalletAccountOpenAcctNo = "濉啓閾惰鍗″彿"; + + public static string SetBankWalletAccountOpenOpentBankNode = "濉啓寮�鎴疯淇℃伅"; + + public static string SetBankWalletAccountOpenBankCertUrl = "涓婁紶鍑瘉"; + + public static string AddWalletAccountOpenFollow = "娣诲姞鍥炶璁板綍"; + + public static string ApplyWalletSingleTransfer = "鎻愪氦杞处鐢宠"; + + public static string ApplyWalletRecharge = "鎻愪氦鍏呭�肩敵璇�"; + + public static string CheckWalletRecharge = "鍏呭�煎鎵�"; + + public static string BankAccountManageFreeze = "閾惰璐︽埛鍐荤粨"; + + public static string AlipayAccountManageUnFreeze = "鏀粯瀹濊处鎴疯В缁�"; + + public static string AlipayAccountManageFreeze = "鏀粯瀹濊处鎴峰喕缁�"; + + public static string BankAccountManageUnFreeze = "閾惰璐︽埛瑙g粨"; + + + #endregion + + #region 瀹㈡埛绠$悊鏃ュ織 + + public static string UploadEnterpriseMaterial = "涓婁紶鏉愭枡"; + public static string SetUserServiceStaff = "鍒嗛厤鏈嶅姟浜哄憳"; + public static string SetUserIndustrialPark = "璋冩暣鍥尯"; + public static string Dutiable = "瀹岀◣鐧昏"; + public static string AddIncentivePayments = "濂栧姳閲戝彂鏀�"; + public static string SignSetFree = "鐢靛瓙绛捐禒閫�"; + + #endregion + + + public static List<string> CertifiedUserOperateNameList = new List<string>() { UserRegister, Enable, Disable, Create, Certification, ResetPassword, Update }; + public static List<string> PlatformUserOperateNameList = new List<string>() { ParkOrHRPublish, UserRegister, Enable, Disable, Create, ResetPassword, Update, Login }; + public static List<string> UserCertificationAuditOperateNameList = new List<string>() { Certification }; + public static List<string> InformationForManageOperateNameList = new List<string>() { Create, Update, OnShelf, OffShelf, Audit }; + public static List<string> InformationWaitForCheckOperateNameList = new List<string>() { Audit }; + public static List<string> UserCertificationManageOperateNameList = new List<string>() { CertificationCreate, CertificationSuccess, CertificationFail }; + public static List<string> CustomerManageOperateNameList = new List<string>() { UploadEnterpriseMaterial, SetUserServiceStaff, SetUserIndustrialPark, Dutiable, AddIncentivePayments, SignSetFree }; + public static List<string> AccountManageOperateNameList = new List<string>() { BankAccountManageFreeze, AlipayAccountManageUnFreeze, AlipayAccountManageFreeze, BankAccountManageUnFreeze }; + } + + public static class InsuranceNeedPriceStatus + { + /// <summary> + /// 10鑽夌 + /// </summary> + public const int Draft = 10; + + /// <summary> + /// 20寰呭鏍� + /// </summary> + public const int PendingReview = 20; + + /// <summary> + /// 杩涜涓� + /// </summary> + public const int Processing = 30; + + /// <summary> + /// 涓嬫灦 + /// </summary> + public const int OffShelf = 40; + + + public const int SystemOffShelf = 50; + + + public const int Reject = -10; + } + + public static class ParkOrHRType + { + /// <summary> + /// 鍥尯 + /// </summary> + public static int Park = 10; + + /// <summary> + /// 浜鸿祫浼佷笟 + /// </summary> + public static int HR = 20; + } + public static class BelongType + { + /// <summary> + /// 鍥尯 + /// </summary> + public static int ParkType = 10; + + /// <summary> + /// 浜鸿祫浼佷笟 + /// </summary> + public static int CompanyType = 20; + } - public static class SearchType { + /// <summary> + /// 鐑悳璇� + /// </summary> public static int HotSearchWords = 10; + /// <summary> + /// 鏈嶅姟绫诲瀷 + /// </summary> public static int ServiceType = 20; + /// <summary> + /// 宸ョ + /// </summary> public static int TypeOfWork = 30; + /// <summary> + /// 鍥尯绫诲瀷 + /// </summary> public static int ParkType = 40; + /// <summary> + /// 璧勮娲诲姩绫诲瀷 + /// </summary> public static int InformationActivityType = 50; + /// <summary> + /// 鏀跨瓥棰佸竷鏈烘瀯 + /// </summary> public static int PolicyIssuingAgency = 60; + /// <summary> + /// 鍖哄煙绠$悊 + /// </summary> public static int RegionalManagement = 70; + /// <summary> + /// 浜у搧绫诲瀷 + /// </summary> public static int ProductType = 80; + /// <summary> + /// 闇�姹傜被鍨� + /// </summary> public static int DemandType = 90; + /// <summary> + /// 闇�姹傝寖鍥� + /// </summary> public static int DemandRange = 100; + /// <summary> + /// 鍛樺伐绂忓埄 + /// </summary> public static int EmployeeBenefits = 110; + /// <summary> + /// 鐏靛伐骞冲彴绠$悊鎻愪緵鏈嶅姟 + /// </summary> public static int LingGongService = 120; + /// <summary> + /// 鏈烘瀯鐗硅壊 + /// </summary> public static int InstitutionalFeatures = 130; + /// <summary> + /// 琛屼笟绫诲瀷 + /// </summary> public static int IndustryType = 160; + } - public static int SocialIdentity = 170; + public static class ServiceType + { + public static int 宸ョ = 10; - public static int EducationalLevel = 180; + public static int 浜鸿祫鏈嶅姟 = 20; + + public static int 鍥尯鏈嶅姟 = 30; + } + + public static class ParkStyleEnum + { + /// <summary> + /// 鍥尯椋庨噰 + /// </summary> + public static int ParkStyles = 10; + + /// <summary> + /// 瀹d紶瑙嗛 + /// </summary> + public static int PromotionalVideo = 20; } public static class ClientId @@ -469,6 +1107,69 @@ } + public static string GetInsuranceTypeCodeName(string type) + { + switch (type) + { + case InsuranceTypeCode.Accident: + return "鎰忓闄�"; + case InsuranceTypeCode.Employer: + return "闆囦富闄�"; + default: + return ""; + } + } + + public static string GetInsureNumberType(int type) + { + switch (type) + { + case InsureNumberType.Low: + return "1-49"; + case InsureNumberType.Middle: + return "50-99"; + case InsureNumberType.Hight: + return "100浜轰互涓�"; + default: + return ""; + } + } + + /// <summary> + /// 闄╃缂栫爜 + /// </summary> + public static class InsuranceTypeCode + { + /// <summary> + /// 鎰忓闄� + /// </summary> + public const string Accident = "ACCIDENT"; + + /// <summary> + /// 闆囦富闄� + /// </summary> + public const string Employer = "EMPLOYER_LIABILITY"; + } + /// <summary> + /// 闄╃缂栫爜 + /// </summary> + public static class InsureNumberType + { + /// <summary> + /// 1~49 + /// </summary> + public const int Low = 10; + + /// <summary> + /// 50~99 + /// </summary> + public const int Middle = 20; + + /// <summary> + /// 100浜轰互涓� + /// </summary> + public const int Hight = 30; + } public static class RequestCode { diff --git a/LifePayment/LifePayment.Domain.Shared/Wallet/WalletConstant.cs b/LifePayment/LifePayment.Domain.Shared/Wallet/WalletConstant.cs new file mode 100644 index 0000000..08969da --- /dev/null +++ b/LifePayment/LifePayment.Domain.Shared/Wallet/WalletConstant.cs @@ -0,0 +1,36 @@ +锘縰sing System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection.Metadata; +using System.Text; +using System.Threading.Tasks; + +namespace LifePayment.Domain.Shared +{ + public class WalletResultCode + { + /// <summary> + /// 澶辫触 + /// </summary> + public const int Fail = 10010; + /// <summary> + /// 閽卞寘浣欓涓嶈冻 + /// </summary> + public const int WalletBalanceInsufficient = 10020; + + /// <summary> + /// 閽卞寘琚喕缁� + /// </summary> + public const int AccountFreeze = 10030; + + /// <summary> + /// 娌℃湁寮�鎴蜂俊鎭� + /// </summary> + public const int NotFoundOpenAccount = 10040; + + /// <summary> + /// 娌℃湁閾惰淇℃伅 + /// </summary> + public const int NotFoundWallet = 10050; + } +} diff --git a/LifePayment/LifePayment.Domain.Shared/Wallet/WalletManagerInput.cs b/LifePayment/LifePayment.Domain.Shared/Wallet/WalletManagerInput.cs new file mode 100644 index 0000000..17b9f0b --- /dev/null +++ b/LifePayment/LifePayment.Domain.Shared/Wallet/WalletManagerInput.cs @@ -0,0 +1,374 @@ +锘縰sing LifePayment.Domain.Shared; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.ComponentModel.DataAnnotations; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace LifePayment.Domain.Shared; + +public class QueryUserWalletAccountOpenInput +{ + public WalletAccountTypeEnum? WalletAccountType { get; set; } + + public Guid? UserId { get; set; } + + public List<Guid> UserIds { get; set; } +} + +public class AddSingleTransferWalletTransactionDetailInput +{ + public Guid? WalletMainId { get; set; } + + /// <summary> + /// 璐﹀彿 + /// </summary> + public string AcctNo { get; set; } + + /// <summary> + /// 璐у竵绫诲瀷 + /// </summary> + public string CcyCode { get; set; } + + /// <summary> + /// 涓绘満璁拌处鏃ユ湡 + /// </summary> + public string AcctDate { get; set; } + + /// <summary> + /// 浜ゆ槗鏃堕棿 + /// </summary> + public string TxTime { get; set; } + + public DateTime AccDateTime { get; set; } + + /// <summary> + /// 涓绘満娴佹按鍙� + /// </summary> + public string HostTrace { get; set; } + + /// <summary> + /// 涓氬姟娴佹按鍙� + /// </summary> + public string BussSeqNo { get; set; } + + /// <summary> + /// 鏄庣粏搴忓彿 + /// </summary> + public string DetailSerialNo { get; set; } + + /// <summary> + /// 浠樻鏂圭綉鐐瑰彿 + /// </summary> + public string OutNode { get; set; } + + /// <summary> + /// 浠樻鏂硅仈琛屽彿 + /// </summary> + public string OutBankNo { get; set; } + + /// <summary> + /// 浠樻琛屽悕绉� + /// </summary> + public string OutBankName { get; set; } + + /// <summary> + /// 浠樻鏂硅处鍙� + /// </summary> + public string OutAcctNo { get; set; } + + /// <summary> + /// 浠樻鏂规埛鍚� + /// </summary> + public string OutAcctName { get; set; } + + /// <summary> + /// 浜ゆ槗閲戦 + /// </summary> + public decimal? TranAmount { get; set; } + + /// <summary> + /// 鏀舵鏂圭綉鐐瑰彿 + /// </summary> + public string InNode { get; set; } + + /// <summary> + /// 鏀舵鏂硅仈琛屽彿 + /// </summary> + public string InBankNo { get; set; } + + /// <summary> + /// 鏀舵鏂硅鍚� + /// </summary> + public string InBankName { get; set; } + + /// <summary> + /// 鏀舵鏂硅处鍙� + /// </summary> + public string InAcctNo { get; set; } + + /// <summary> + /// 鏀舵鏂规埛鍚� + /// </summary> + public string InAcctName { get; set; } + + /// <summary> + /// 鍊熻捶鏍囧織 + /// </summary> + public string DcFlag { get; set; } + + /// <summary> + /// 鍑瘉鍙� + /// </summary> + public string VoucherNo { get; set; } + + /// <summary> + /// 鎵嬬画璐� + /// </summary> + public decimal? TranFee { get; set; } + + /// <summary> + /// 閭數璐� + /// </summary> + public decimal? PostFee { get; set; } + + /// <summary> + /// 璐﹂潰浣欓 + /// </summary> + public decimal? AcctBalance { get; set; } + + /// <summary> + /// 鐢ㄩ�旓紝闄勮█ + /// </summary> + public string Purpose { get; set; } + + /// <summary> + /// 鎽樿 + /// </summary> + public string AbstractStr { get; set; } + + /// <summary> + /// 浠g悊浜烘埛鍚� + /// </summary> + public string ProxyPayName { get; set; } + + /// <summary> + /// 浠g悊浜鸿处鍙� + /// </summary> + public string ProxyPayAcc { get; set; } + + /// <summary> + /// 浠g悊浜洪摱琛屽悕绉� + /// </summary> + public string ProxyPayBankName { get; set; } + + /// <summary> + /// 涓绘満鏃ユ湡 + /// </summary> + public string HostDate { get; set; } + + /// <summary> + /// 浜ゆ槗娴佹按鍙� + /// </summary> + public string TranSeqNo { get; set; } + + /// <summary> + /// 澶囨敞1 + /// </summary> + public string Remark1 { get; set; } + + /// <summary> + /// 澶囨敞2 + /// </summary> + public string Remark2 { get; set; } + + /// <summary> + /// 琚啿姝f爣蹇� + /// </summary> + public string BeReverseFlag { get; set; } + + /// <summary> + /// 鏃跺簭鏃堕棿 + /// </summary> + public string SeqTime { get; set; } + + /// <summary> + /// 璐圭敤浠g爜 + /// </summary> + public string FeeCode { get; set; } + + /// <summary> + /// 鐢靛瓙鍥炲崟 + /// </summary> + public string ElecBillUrl { get; set; } + + /// <summary> + /// 闅忔満瀵嗙爜 + /// </summary> + public string RandomPwd { get; set; } + + /// <summary> + /// 鏂囨。Id + /// </summary> + public string DocID { get; set; } + + public WalletTransactionStatusEnum? Status { get; set; } +} + +public class OperateWalletAmountBaseInput +{ + + + /// <summary> + /// 涓氬姟娴佹按鍙� + /// </summary> + [DisplayName("涓氬姟娴佹按鍙�")] + [MaxLength(20, ErrorMessage = "{0}鏈�澶ч暱搴︿负{1}")] + public string BussSeqNo { get; set; } + + /// <summary> + /// 浠樻浜鸿处鎴� 鎵f璐︽埛锛堟浠樼姸鎬佺殑璐︽埛锛� + /// </summary> + [DisplayName("浠樻浜鸿处鎴�")] + [MaxLength(20, ErrorMessage = "{0}鏈�澶ч暱搴︿负{1}")] + [Required] + public string OutAcctNo { get; set; } + + /// <summary> + /// 浠樻浜哄悕绉� 浠樻璐︽埛鎴峰悕 + /// </summary> + [DisplayName("浠樻浜哄悕绉�")] + [MaxLength(60, ErrorMessage = "{0}鏈�澶ч暱搴︿负{1}")] + [Required] + public string OutAcctName { get; set; } + + /// <summary> + /// 浠樻琛屽悕绉� + /// </summary> + public string OutBankName { get; set; } + + /// <summary> + /// 鎿嶄綔绫诲瀷 + /// </summary> + [DisplayName("鎿嶄綔绫诲瀷")] + [EnumValidation(typeof(WalletAmountOperateTypeEnum), ErrorMessage = "{0}寮傚父")] + public WalletAmountOperateTypeEnum AmountOperateType { get; set; } + + /// <summary> + /// 鎿嶄綔鐨勯噾棰濈被鍨� + /// </summary> + [DisplayName("鎿嶄綔閲戦绫诲瀷")] + [EnumValidation(typeof(WalletOperateAmountTypeEnum), ErrorMessage = "{0}寮傚父")] + public WalletOperateAmountTypeEnum OperateAmountType { get; set; } + + /// <summary> + /// 涓氬姟绫诲瀷 + /// </summary> + [DisplayName("涓氬姟绫诲瀷")] + [EnumValidation(typeof(WalletDetailBusinessTypeEnum), ErrorMessage = "{0}寮傚父")] + public WalletDetailBusinessTypeEnum BusinessType { get; set; } + + /// <summary> + /// 鏀舵鏂硅处鎴� + /// </summary> + [DisplayName("鐩爣璐︽埛")] + [MaxLength(32, ErrorMessage = "{0}鏈�澶ч暱搴︿负{1}")] + [Required] + public string InAcctNo { get; set; } + + /// <summary> + /// 鏀舵鏂硅处鎴锋埛鍚� + /// </summary> + [DisplayName("鐩爣璐︽埛鎴峰悕")] + [MaxLength(60, ErrorMessage = "{0}鏈�澶ч暱搴︿负{1}")] + [Required] + public string InAcctName { get; set; } + + /// <summary> + /// 鏀跺叆璐︽埛鐨勮处鎴风被鍨� + /// </summary> + public TransAccountTypeEnum InAccountType { get; set; } + + /// <summary> + /// 鏀舵鏂硅鍚� + /// </summary> + + public string InBankName { get; set; } + + /// <summary> + /// 杞嚭閲戦 濡備负XML鎶ユ枃锛屽垯鐩存帴杈撳叆杈撳嚭浠ュ厓涓哄崟浣嶇殑娴偣鏁板�硷紝濡�2.50 (涓ゅ厓浜旇) + /// </summary> + [DisplayName("杞嚭閲戦")] + [Required] + [Range(0.01, double.MaxValue, ErrorMessage = "閲戦寮傚父")] + public decimal TranAmount { get; set; } + + /// <summary> + /// 璧勯噾鐢ㄩ�� 100涓眽瀛楋紝瀵规柟鑳藉惁鐪嬪埌姝ょ敤閫旇鏀舵鏂归摱琛岀殑鏀寔銆� + /// </summary> + [MaxLength(100, ErrorMessage = "{0}鏈�澶ч暱搴︿负{1}")] + [DisplayName("璧勯噾鐢ㄩ��")] + public string UseEx { get; set; } + + /// <summary> + /// 鍒濆浜ゆ槗鐘舵�� + /// </summary> + [DisplayName("鍒濆浜ゆ槗鐘舵��")] + [EnumValidation(typeof(WalletTransactionStatusEnum), ErrorMessage = "{0}寮傚父")] + public WalletTransactionStatusEnum Status { get; set; } + + /// <summary> + /// 浼佷笟鍚堝悓 + /// </summary> + public string ContractUrl { get; set; } +} + +public class OperateWalletAmountInput : OperateWalletAmountBaseInput +{ + /// <summary> + /// 鐢ㄦ埛Id + /// </summary> + public Guid UserId { get; set; } + + /// <summary> + /// 浠樻璐︽埛 閫夋嫨鏀粯瀹濅笌閾惰鍗� + /// </summary> + [DisplayName("浠樻璐︽埛")] + [Required(ErrorMessage = "{0}涓嶈兘涓虹┖")] + public WalletAccountTypeEnum WalletAccountType { get; set; } + + public Guid WalletMainId { get; set; } +} + +public class OperateBatchWalletAmountInput +{ + /// <summary> + /// 鐢ㄦ埛Id + /// </summary> + public Guid UserId { get; set; } + + /// <summary> + /// 浠樻璐︽埛 閫夋嫨鏀粯瀹濅笌閾惰鍗� + /// </summary> + [DisplayName("浠樻璐︽埛")] + [Required(ErrorMessage = "{0}涓嶈兘涓虹┖")] + public WalletAccountTypeEnum WalletAccountType { get; set; } + + /// <summary> + /// 鎿嶄綔鏄庣粏 + /// </summary> + public List<OperateWalletAmountBaseInput> OperateWalletAmountDetails { get; set; } +} + +public class CalculationWalletPayFeeInput +{ + public decimal Amount { get; set; } + + /// <summary> + /// 閽卞寘绫诲瀷 + /// </summary> + public WalletAccountTypeEnum WalletAccountType { get; set; } + +} diff --git a/LifePayment/LifePayment.Domain.Shared/Wallet/WalletManagerOutput.cs b/LifePayment/LifePayment.Domain.Shared/Wallet/WalletManagerOutput.cs new file mode 100644 index 0000000..c3b7604 --- /dev/null +++ b/LifePayment/LifePayment.Domain.Shared/Wallet/WalletManagerOutput.cs @@ -0,0 +1,300 @@ +锘縰sing Org.BouncyCastle.Asn1.Mozilla; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace LifePayment.Domain.Shared; + +public class UserWalletBalanceInfoOutput +{ + /// <summary> + /// 鏄惁寮�閫氳绫诲瀷鐨勯挶鍖呰处鎴� + /// </summary> + public bool IsWalletAccountOpen { get; set; } + + /// <summary> + /// 閽卞寘id + /// </summary> + public Guid? WalletMainId { get; set; } + + /// <summary> + /// 璐﹀彿 + /// </summary> + public string AcctNo { get; set; } + + /// <summary> + /// 鎴峰悕 + /// </summary> + public string AcctName { get; set; } + + + /// <summary> + /// 寮�鎴烽摱琛屾敮琛� + /// </summary> + public string OpentBankNodeAddress { get; set; } + + /// <summary> + /// 鍙敤浣欓 + /// </summary> + public decimal CanUseMoneyTotal { get; set; } + + /// <summary> + /// 瀹氬悜璧勯噾 + /// </summary> + public decimal DirectMoneyTotal { get; set; } + + /// <summary> + /// 鍙戣柂閽卞寘 + /// </summary> + public decimal SalaryMoneyTotal { get; set; } + + /// <summary> + /// 涓嶅彲鐢ㄤ綑棰� + /// </summary> + public decimal CanNotUseMoneyTotal { get; set; } + + /// <summary> + /// 鍐荤粨浣欓 + /// </summary> + public decimal FreezeMoneyTotal { get; set; } + + /// <summary> + /// 璧勯噾鎬婚 + /// </summary> + public decimal AllMoneyTotal { get; set; } + + /// <summary> + /// 閾惰鍚嶇О + /// </summary> + public string BankName { get; set; } + + /// <summary> + /// 鏍规嵁閽卞寘鏀粯绫诲瀷鑾峰彇瀵瑰簲鐨勬�婚噾棰� + /// </summary> + /// <param name="walletPayType"></param> + /// <returns></returns> + public decimal GetMoneyTotalByPayType(WalletPayTypeEnum walletPayType) + { + return walletPayType switch + { + WalletPayTypeEnum.CanUseMoney => this.CanUseMoneyTotal, + WalletPayTypeEnum.DirectMoney => this.DirectMoneyTotal, + WalletPayTypeEnum.SalaryMoney => this.SalaryMoneyTotal, + _ => 0m + }; + } +} + +/// <summary> +/// 閽卞寘璐︽埛绫诲瀷寮�鎴蜂俊鎭� +/// </summary> +public class WalletAccountTypeOpenInfoOutput +{ + public Guid? WalletAccountOpenId { get; set; } + + /// <summary> + /// 閽卞寘璐︽埛绫诲瀷 + /// </summary> + public WalletAccountTypeEnum? WalletAccountType { get; set; } + + /// <summary> + /// 璐﹀彿 + /// </summary> + public string AcctNo { get; set; } + + /// <summary> + /// 璐﹀彿鍚嶇О + /// </summary> + public string AcctName { get; set; } + + /// <summary> + /// 浼佷笟鍚嶇О + /// </summary> + public string EnterpriseName { get; set; } + + /// <summary> + /// 寮�鎴烽摱琛� + /// </summary> + public string OpentBankNode { get; set; } + + /// <summary> + /// 缁熶竴绀句細淇$敤浠g爜 + /// </summary> + public string SocietyCreditCode { get; set; } + + /// <summary> + /// 鏄惁寮�鎴� + /// </summary> + public bool IsWalletAccountOpen { get; set; } + + /// <summary> + /// 寮�鎴烽摱琛屽湴鍧� + /// </summary> + public string OpentBankNodeAddress { get; set; } + + /// <summary> + /// 閾惰鍚嶇О + /// </summary> + public string BankName { get; set; } +} + +public class WalletBalanceDetailOutput +{ + + + /// <summary> + /// 璐﹀彿 + /// </summary> + public string AcctNo { get; set; } + + /// <summary> + /// 寮�鎴疯 + /// </summary> + public string BankName { get; set; } + + + /// <summary> + /// 閾惰鍗¤祫閲戞�婚 + /// </summary> + public decimal? AllMoneyTotal { get; set; } + + /// <summary> + /// 閾惰鍗¤祫閲戞�婚 + /// </summary> + public decimal? BankMoneyTotal { get; set; } + + /// <summary> + /// 閾惰鍗℃槰鏃ユ�讳綑棰� + /// </summary> + public decimal? YesterdayBankMoneyTotal { get; set; } + + /// <summary> + /// 鏀粯瀹濊处鍙� + /// </summary> + public string AlipayAccount { get; set; } + + /// <summary> + /// 鏀粯瀹濅綑棰� + /// </summary> + public decimal? AlipayMoneyTotal { get; set; } + + /// <summary> + /// 鏀粯瀹濇槰鏃ユ�讳綑棰� + /// </summary> + public decimal AlipayYesterdayMoneyTotal { get; set; } + + /// <summary> + /// 閾惰鍐荤粨浣欓 + /// </summary> + public decimal? BankFreezeMoneyTotal { get; set; } + + /// <summary> + /// 鏀粯瀹濆喕缁撲綑棰� + /// </summary> + public decimal? AlipayFreezeMoneyTotal { get; set; } + + /// <summary> + /// 閽卞寘鐘舵�� + /// </summary> + public WalletMainStatusEnum? Status { get; set; } + + +} + +public class AllBankListOutput +{ + public int Id { get; set; } + + /// <summary> + /// 棣栧瓧姣嶆爣璁� + /// </summary> + public string Mark { get; set; } + + /// <summary> + /// 閾惰鍚嶇О + /// </summary> + public string Name { get; set; } + + /// <summary> + /// 鏄惁鏄儹闂� + /// </summary> + public int? IsHot { get; set; } +} + +public class CheckUserWalletBalanceInfoOutput +{ + + /// <summary> + /// 璐﹀彿 + /// </summary> + public string AcctNo { get; set; } + + /// <summary> + /// 鎴峰悕 + /// </summary> + public string AcctName { get; set; } + + + /// <summary> + /// 鍙敤浣欓 + /// </summary> + public decimal CanUseMoneyTotal { get; set; } + + /// <summary> + /// 瀹氬悜璧勯噾 + /// </summary> + public decimal DirectMoneyTotal { get; set; } + + /// <summary> + /// 鍙戣柂閽卞寘 + /// </summary> + public decimal SalaryMoneyTotal { get; set; } + + /// <summary> + /// 涓嶅彲鐢ㄤ綑棰� + /// </summary> + public decimal CanNotUseMoneyTotal { get; set; } + + /// <summary> + /// 鍐荤粨浣欓 + /// </summary> + public decimal FreezeMoneyTotal { get; set; } + + /// <summary> + /// 璧勯噾鎬婚 + /// </summary> + public decimal AllMoneyTotal { get; set; } + + /// <summary> + /// 鏍规嵁閽卞寘鏀粯绫诲瀷鑾峰彇瀵瑰簲鐨勬�婚噾棰� + /// </summary> + /// <param name="walletPayType"></param> + /// <returns></returns> + public decimal GetMoneyTotalByPayType(WalletPayTypeEnum walletPayType) + { + return walletPayType switch + { + WalletPayTypeEnum.CanUseMoney => this.CanUseMoneyTotal, + WalletPayTypeEnum.DirectMoney => this.DirectMoneyTotal, + WalletPayTypeEnum.SalaryMoney => this.SalaryMoneyTotal, + _ => 0m + }; + } +} + +public class WalletPayChannelFeeSettingOutput +{ + public Guid WalletPayChannelId { get; set; } + + public decimal? BeginAmount { get; set; } + + public decimal? EndAmount { get; set; } + + public WalletPayChannelFeeCalculationTypeEnum FeeCalculationType { get; set; } + + public decimal FeeCalculationValue { get; set; } + + public Guid Id { get; set; } +} diff --git a/LifePayment/LifePayment.Domain.Shared/Wallet/WalletSingleTransactionInput.cs b/LifePayment/LifePayment.Domain.Shared/Wallet/WalletSingleTransactionInput.cs new file mode 100644 index 0000000..3126484 --- /dev/null +++ b/LifePayment/LifePayment.Domain.Shared/Wallet/WalletSingleTransactionInput.cs @@ -0,0 +1,413 @@ +锘縰sing System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.Linq; +using System.Runtime.CompilerServices; +using System.Text; +using System.Threading.Tasks; + +namespace LifePayment.Domain.Shared +{ + public class WalletSingleTransactionInput + { + ///// <summary> + ///// 杞处鍑瘉鍙� 鏍囩ず浜ゆ槗鍞竴鎬э紝鍚屼竴瀹㈡埛涓婇�佺殑涓嶅彲閲嶅锛屽缓璁牸寮忥細yyyymmddHHSS+8浣嶇郴鍒椼�傝姹�6涓湀鍐呭敮涓�銆� + ///// </summary> + //[MaxLength(20)] + //[Required] + //public string ThirdVoucher { get; set; } + + + /// <summary> + /// 浠樻浜鸿处鎴� 鎵f璐︽埛 + /// </summary> + [MaxLength(20)] + [Required] + public string OutAcctNo { get; set; } + + /// <summary> + /// 鏀舵浜哄紑鎴疯琛屽彿 璺ㄨ杞处寤鸿蹇呰緭銆備负浜鸿鐧昏鍦ㄥ唽鐨勫晢涓氶摱琛屽彿锛岃嫢杈撳叆鍒欓暱搴﹀繀椤诲湪4 ~12浣嶄箣闂达紱 + /// </summary> + [MaxLength(12)] + public string InAcctBankNode { get; set; } + + /// <summary> + /// 鏀舵浜鸿处鎴� + /// </summary> + [MaxLength(32)] + [Required] + public string InAcctNo { get; set; } + + /// <summary> + /// 鏀舵浜鸿处鎴锋埛鍚� + /// </summary> + [MaxLength(60)] + [Required] + public string InAcctName { get; set; } + + /// <summary> + /// 杞嚭閲戦 濡備负XML鎶ユ枃锛屽垯鐩存帴杈撳叆杈撳嚭浠ュ厓涓哄崟浣嶇殑娴偣鏁板�硷紝濡�2.50 (涓ゅ厓浜旇) + /// </summary> + + [Required] + public decimal TranAmount { get; set; } + + /// <summary> + /// 璧勯噾鐢ㄩ�� 100涓眽瀛楋紝瀵规柟鑳藉惁鐪嬪埌姝ょ敤閫旇鏀舵鏂归摱琛岀殑鏀寔銆� + /// </summary> + [MaxLength(100)] + + public string UseEx { get; set; } + + /// <summary> + /// 姝粯缂栧彿 + /// </summary> + [MaxLength(30)] + [Required] + public string FreezeNo { get; set; } + + /// <summary> + /// 濮旀墭鍗曚綅鍗忚鍙� + /// </summary> + [MaxLength(32)] + [Required] + public string DfAgreementNo { get; set; } + + + /// <summary> + /// 璐归」缂栫爜 + /// </summary> + [MaxLength(10)] + [Required] + public string AgreementCode { get; set; } + } + + public class WalletSingleTransactionOutput + { + /// <summary> + /// 杞处鍑瘉鍙� + /// </summary> + public string ThirdVoucher { get; set; } + + /// <summary> + /// 閾惰娴佹按鍙� 閾惰涓氬姟娴佹按鍙凤紱鍙互鐢ㄤ簬瀵硅处 + /// </summary> + public string FrontLogNo { get; set; } + + /// <summary> + /// 浠樻浜鸿处鎴� + /// </summary> + public string OutAcctNo { get; set; } + + /// <summary> + /// 鏀舵浜鸿处鎴� + /// </summary> + public string InAcctNo { get; set; } + + /// <summary> + /// 鏀舵浜鸿处鎴锋埛鍚� + /// </summary> + public string InAcctName { get; set; } + + /// <summary> + /// 杞嚭閲戦 + /// </summary> + public string TranAmount { get; set; } + + /// <summary> + /// 浜ゆ槗鐘舵�佹爣蹇� + /// 20锛氫氦鏄撴垚鍔� + /// 30锛氬け璐ワ紱 + /// 鍏朵粬涓洪摱琛屽彈鐞嗘垚鍔熷鐞嗕腑锛岃浣跨敤鈥滀氦鏄撹繘搴︽煡璇GF005鈥濇帴鍙h幏鍙栨渶缁堢姸鎬� + /// </summary> + public string Stt { get; set; } + } + + + public class WalletSingleApplicationSuspensionPaymentInput + { + ///// <summary> + ///// 杞处鍑瘉鍙� 鏍囩ず浜ゆ槗鍞竴鎬э紝鍚屼竴瀹㈡埛涓婇�佺殑涓嶅彲閲嶅锛屽缓璁牸寮忥細yyyymmddHHSS+8浣嶇郴鍒椼�傝姹�6涓湀鍐呭敮涓�銆� + ///// </summary> + //[MaxLength(20)] + //[Required] + //public string ThirdVoucher { get; set; } + + public Guid? WalletMainId { get; set; } + + /// <summary> + /// 璇锋眰鏂圭郴缁熸祦姘村彿 + /// 鍞竴鏍囪瘑涓�绗斾氦鏄� 澶囨敞锛氾紙濡傛灉鏌愮浜ゆ槗瑕佹湁澶氭璇锋眰鐨勬墠鑳藉畬鎴愮殑锛屽涓氦鏄撹姹傚寘娴佹按鍙疯淇濇寔涓�鑷达級 + /// </summary> + [MaxLength(20)] + [Required] + public string CnsmrSeqNo { get; set; } + + /// <summary> + /// 浠樻浜鸿处鎴� 鎵f璐︽埛 鏀粯瀹濅紶 璁拌处鏈琲d鐨勫�� + /// </summary> + [MaxLength(20)] + [Required] + public string OutAcctNo { get; set; } + + /// <summary> + /// 鏀舵浜哄紑鎴疯琛屽彿 璺ㄨ杞处寤鸿蹇呰緭銆備负浜鸿鐧昏鍦ㄥ唽鐨勫晢涓氶摱琛屽彿锛岃嫢杈撳叆鍒欓暱搴﹀繀椤诲湪4 ~12浣嶄箣闂达紱 + /// </summary> + [MaxLength(12)] + public string InAcctBankNode { get; set; } + + /// <summary> + /// 鏀舵浜鸿处鎴� 鎴栬�呮槸鏀粯瀹濈櫥褰曞彿 + /// </summary> + [MaxLength(32)] + [Required] + public string InAcctNo { get; set; } + + /// <summary> + /// 鏀舵浜鸿处鎴锋埛鍚� + /// </summary> + [MaxLength(60)] + [Required] + public string InAcctName { get; set; } + + /// <summary> + /// 杞嚭閲戦 濡備负XML鎶ユ枃锛屽垯鐩存帴杈撳叆杈撳嚭浠ュ厓涓哄崟浣嶇殑娴偣鏁板�硷紝濡�2.50 (涓ゅ厓浜旇) + /// </summary> + + [Required] + public decimal TranAmount { get; set; } + + /// <summary> + /// 璧勯噾鐢ㄩ�� 100涓眽瀛楋紝瀵规柟鑳藉惁鐪嬪埌姝ょ敤閫旇鏀舵鏂归摱琛岀殑鏀寔銆� + /// </summary> + [MaxLength(100)] + + public string UseEx { get; set; } + + + /// <summary> + /// 琛屽唴璺ㄨ鏍囧織 1锛氳鍐呰浆璐︼紝0锛氳法琛岃浆璐� + /// </summary> + [MaxLength(1)] + [Required] + public string UnionFlag { get; set; } + + [Required] + [MaxLength(60)] + public string InAcctBankName { get; set; } + + /// <summary> + /// 浠樻浜哄悕绉� 浠樻璐︽埛鎴峰悕 鏀粯瀹濅紶 agreement_no + /// </summary> + [MaxLength(60)] + [Required] + public string OutAcctName { get; set; } + + + + ///// <summary> + ///// 姝粯缂栧彿 + ///// </summary> + //[MaxLength(30)] + //[Required] + //public string FreezeNo { get; set; } + + ///// <summary> + ///// 濮旀墭鍗曚綅鍗忚鍙� + ///// </summary> + //[MaxLength(32)] + //[Required] + //public string DfAgreementNo { get; set; } + + + ///// <summary> + ///// 璐归」缂栫爜 + ///// </summary> + //[MaxLength(10)] + //[Required] + //public string AgreementCode { get; set; } + } + public class WalletSingleApplicationSuspensionPaymentOutput + { + /// <summary> + /// 杞处鍑瘉鍙� + /// </summary> + public string ThirdVoucher { get; set; } + + /// <summary> + /// 閾惰娴佹按鍙� 閾惰涓氬姟娴佹按鍙凤紱鍙互鐢ㄤ簬瀵硅处 + /// 鏀粯瀹濅负 鏀粯瀹濊浆璐﹁鍗曞彿 order_id + /// </summary> + public string FrontLogNo { get; set; } + + /// <summary> + /// 瀹㈡埛鑷畾涔夊嚟璇佸彿 鐢ㄤ簬瀹㈡埛杞处鐧昏鍜屽唴閮ㄨ瘑鍒紝閫氳繃杞处缁撴灉鏌ヨ鍙互杩斿洖銆傞摱琛屼笉妫�鏌ュ敮涓�鎬� + /// 鏀粯瀹濅负 鍟嗘埛璁㈠崟鍙� out_biz_no + /// </summary> + public string CstInnerFlowNo { get; set; } + + /// <summary> + /// 璐у竵绫诲瀷 + /// </summary> + public string CcyCode { get; set; } + + /// <summary> + /// 浠樻浜鸿处鎴峰悕绉� + /// 鏀粯瀹濅负 agreement_no + /// </summary> + public string OutAcctName { get; set; } + + /// <summary> + /// 浠樻浜鸿处鎴� 璁拌处鏈琲d鐨勫�� + /// </summary> + public string OutAcctNo { get; set; } + + /// <summary> + /// 鏀舵浜哄紑鎴疯鍚嶇О + /// </summary> + public string InAcctBankName { get; set; } + + /// <summary> + /// 鏀舵浜鸿处鎴� + /// </summary> + public string InAcctNo { get; set; } + + /// <summary> + /// 鏀舵浜鸿处鎴锋埛鍚� + /// </summary> + public string InAcctName { get; set; } + + /// <summary> + /// 浜ゆ槗閲戦 + /// </summary> + public string TranAmount { get; set; } + + /// <summary> + /// 琛屽唴璺ㄨ鏍囧織 1锛氳鍐呰浆璐︼紝0锛氳法琛岃浆璐� + /// </summary> + public string UnionFlag { get; set; } + + /// <summary> + /// 鎵嬬画璐� 杞处鎵嬬画璐归绠楋紝瀹為檯鎵嬬画璐圭敤浠ュ疄闄呮墸鍙栫殑涓哄噯銆� + /// </summary> + public string Fee1 { get; set; } + + /// <summary> + /// 閭數璐� + /// </summary> + public string Fee2 { get; set; } + + /// <summary> + /// 閾惰杩斿洖娴佹按鍙� 閾惰璁拌处娴佹按鍙凤紱杞处鎴愬姛鍚庯紝閾惰杩斿洖鐨勬祦姘村彿銆� + /// 鏀粯瀹濅负 鏀粯瀹濇敮浠樿祫閲戞祦姘村彿 pay_fund_order_id + /// </summary> + public string HostFlowNo { get; set; } + + /// <summary> + /// 璁拌处鏃ユ湡 閾惰浜ゆ槗鎴愬姛鍚庣殑璁拌处鏃ユ湡锛屼粎瀵硅鍐呭疄鏃惰浆璐︿氦鏄撴湁鏁堛�� + /// </summary> + public string HostTxDate { get; set; } + + /// <summary> + /// 浜ゆ槗鐘舵�佹爣蹇� 20锛氫氦鏄撴垚鍔� 30锛氬け璐ワ紱鍏朵粬涓洪摱琛屽彈鐞嗘垚鍔熷鐞嗕腑锛岃浣跨敤鈥滀氦鏄撹繘搴︽煡璇�4005鈥濇帴鍙h幏鍙栨渶缁堢姸鎬� + /// </summary> + public string Stt { get; set; } + + /// <summary> + /// 杞处鍗曟嵁鐘舵�併�� + /// SUCCESS锛氭垚鍔燂紙瀵硅浆璐﹀埌閾惰鍗$殑鍗曟嵁, 璇ョ姸鎬佸彲鑳藉彉涓洪��绁╗REFUND] 鐘舵�侊級锛� + /// FAIL锛氬け璐ワ紱 + /// DEALING锛氬鐞嗕腑锛� + /// REFUND锛氶��绁紱 + /// </summary> + public string AlipayStatus { get; set; } + + /// <summary> + /// 姝粯缂栧彿 鏈夋晥鐘舵�佺殑骞冲畨鏄撴浠樼紪鍙凤紝浠嶫GF001姝粯鍚庤繑鍥炵殑 + /// </summary> + public string FreezeNo { get; set; } + } + + /// <summary> + /// 浼佷笟璐︽埛浣欓鏌ヨ_閾朵紒鐩磋仈杈撳嚭鍙傛暟 + /// </summary> + public class GetCorAcctBalanceQueryOutput + { + /// <summary> + /// 璐﹀彿 + /// 鏁版嵁闀垮害锛�20锛屾槸鍚﹀繀杈擄細Y + /// </summary> + public string Account { get; set; } + + + /// <summary> + /// 璐︽埛鎴峰悕 + /// 鏁版嵁闀垮害锛�60锛屾槸鍚﹀繀杈擄細Y + /// </summary> + public string AccountName { get; set; } + + /// <summary> + /// 鍙敤浣欓 涓嶅惈闆嗗洟鐜伴噾绠$悊鍚堢害浣欓 + /// 鏁版嵁闀垮害锛�16,2锛屾槸鍚﹀繀杈擄細Y + /// </summary> + public decimal? Balance { get; set; } + + /// <summary> + /// 璐﹂潰浣欓 涓嶅惈闆嗗洟鐜伴噾绠$悊鍚堢害浣欓 + /// 鏁版嵁闀垮害锛�13锛屾槸鍚﹀繀杈擄細Y + /// </summary> + public decimal? TotalAmount { get; set; } + + /// <summary> + /// 璐︽埛鐘舵�� 璐︽埛灞傜姸鎬侊紝A姝e父銆丏涓嶅姩鎴枫�両 涔呮偓鎴凤紝鑻ユ湁澶氫釜鐘舵�侊紝鈥渱鈥濆垎鍓诧紝濡傦細A| DGZH02銆侱GZH02: 璐︽埛姝粯 + /// 鏁版嵁闀垮害锛�10锛屾槸鍚﹀繀杈擄細N + /// </summary> + public string AccountStatus { get; set; } + + /// <summary> + /// 鍐荤粨閲戦 + /// 鏁版嵁闀垮害锛�16,2锛屾槸鍚﹀繀杈擄細N + /// </summary> + public decimal? HoldBalance { get; set; } + + /// <summary> + /// 姝粯閲戦 + /// 鏁版嵁闀垮害锛�16,2锛屾槸鍚﹀繀杈擄細N + /// </summary> + public decimal? StopBalance { get; set; } + + /// <summary> + /// 鏄ㄦ棩浣欓 + /// 鏁版嵁闀垮害锛�16,2锛屾槸鍚﹀繀杈擄細N + /// </summary> + public decimal? LastBalance { get; set; } + + + + /// <summary> + /// 璐︽埛浣欓 + /// 鏁版嵁闀垮害锛�16,2锛屾槸鍚﹀繀杈擄細N + /// </summary> + public decimal? AcctBalance { get; set; } + + + + /// <summary> + /// 璐︽埛鐘舵�佸瓧 + /// 鑻ユ湁澶氫釜鐘舵�佸瓧锛屸�渱鈥濆垎鍓诧紝濡傦細DGZH02-璐︽埛姝粯|DGZH06-鍙敹涓嶄粯鐘舵�佸瓧鍊煎涓嬶紝鍙兘浼氭柊澧烇細 + /// DGZH02-璐︽埛姝粯锛� + /// DGZH03-鍗伴壌鎸傚け锛� + /// DGZHE6-棰勫紑鎴凤紝 + /// DGZHG9-寮�鎴蜂笁澶╃鎺э紝 + /// DGZH06-鍙敹涓嶄粯锛� + /// DGZH07-涓嶄粯涓嶆敹锛� + /// DGZH08-鍙粯涓嶆敹锛� + /// DGBZ02-璐︽埛姝粯锛� + /// DGBZ07-涓嶄粯涓嶆敹锛� + /// DGBZG9-寮�鎴蜂笁澶╃鎺э紝 + /// ZH9999-鍏朵粬寮傚父 + /// 鏁版嵁闀垮害锛�500锛屾槸鍚﹀繀杈擄細N + /// </summary> + public string AccountStatusDesc { get; set; } + } +} diff --git a/LifePayment/LifePayment.Domain.Shared/WeChat/CreateQrCodeInput.cs b/LifePayment/LifePayment.Domain.Shared/WeChat/CreateQrCodeInput.cs new file mode 100644 index 0000000..4f53334 --- /dev/null +++ b/LifePayment/LifePayment.Domain.Shared/WeChat/CreateQrCodeInput.cs @@ -0,0 +1,167 @@ +锘縰sing Newtonsoft.Json; +using System; + +using System.Collections.Generic; + +namespace LifePayment.Domain.Shared +{ + public class CreateQrCodeInput + { + /// <summary> + /// 鏈�澶�32涓彲瑙佸瓧绗︼紝鍙敮鎸佹暟瀛楋紝澶у皬鍐欒嫳鏂囦互鍙婇儴鍒嗙壒娈婂瓧绗︼細!#$&'()*+,/:;=?@-._~锛� + /// 鍏跺畠瀛楃璇疯嚜琛岀紪鐮佷负鍚堟硶瀛楃锛堝洜涓嶆敮鎸�%锛屼腑鏂囨棤娉曚娇鐢� urlencode 澶勭悊锛岃浣跨敤鍏朵粬缂栫爜鏂瑰紡锛� + /// </summary> + public string Scene { get; set; } + + /// <summary> + /// 鍚嶇墖浜岀淮鐮佹壂鎻忓惎鍔ㄩ〉 + /// </summary> + public string Page { get; set; } + + /// <summary> + /// 瑕佹墦寮�鐨勫皬绋嬪簭鐗堟湰銆傛寮忕増涓� "release"锛屼綋楠岀増涓� "trial"锛屽紑鍙戠増涓� "develop"銆傞粯璁ゆ槸姝e紡鐗堛�� + /// </summary> + public string EnvVersion { get; set; } = "release"; + + /// <summary> + /// 榛樿鏄痶rue锛屾鏌age 鏄惁瀛樺湪锛屼负 true 鏃� page 蹇呴』鏄凡缁忓彂甯冪殑灏忕▼搴忓瓨鍦ㄧ殑椤甸潰锛堝惁鍒欐姤閿欙級锛� + /// 涓� false 鏃跺厑璁稿皬绋嬪簭鏈彂甯冩垨鑰� page 涓嶅瓨鍦紝 浣唒age 鏈夋暟閲忎笂闄愶紙60000涓級璇峰嬁婊ョ敤銆� + /// </summary> + public bool CheckPath { get; set; } = true; + + /// <summary> + /// 榛樿430锛屼簩缁寸爜鐨勫搴︼紝鍗曚綅 px锛屾渶灏� 280px锛屾渶澶� 1280px + /// </summary> + public int Width { get; set; } = 430; + } + + public class WxMiniAppIndentity + { + /// <summary> + /// 浼氳瘽瀵嗛挜 + /// </summary> + [JsonProperty("session_key")] + public string SessionKey { get; set; } + + /// <summary> + /// 灏忕▼搴廜penId + /// </summary> + [JsonProperty("openid")] + public string OpenId { get; set; } + + public string UnionId { get; set; } + } + + public class WxMiniAppUserInfo + { + public string OpenId { get; set; } + + public string PhoneNumber { get; set; } + + public string NickName { get; set; } + + public int Gender { get; set; } + + public string Language { get; set; } + + public string City { get; set; } + + public string Province { get; set; } + + public string Country { get; set; } + + public string AvatarUrl { get; set; } + + public string CountryCode { get; set; } + } + + public class GetCgiWritingInput + { + [JsonProperty("access_token")] + public string AccessToken { get; set; } + + [JsonProperty("offset")] + public int Offset { get; set; } = 0; + + [JsonProperty("count")] + public int Count { get; set; } = 20; + + [JsonProperty("no_content")] + public int NoContent { get; set; } = 0; + } + + + public class GetCgiWritingResponse + { + [JsonProperty("total_count")] + public int Total_count { get; set; } + + [JsonProperty("item_count")] + public int Utem_count { get; set; } + + [JsonProperty("item")] + public List<GetCgiWritingItemResponse> Item { get; set; } + + } + + public class GetCgiWritingItemResponse + { + [JsonProperty("article_id")] + public string Article_id { get; set; } + + [JsonProperty("content")] + public GetCgiWritingContentResponse Content { get; set; } + + [JsonProperty("create_time")] + public long? Create_time { get; set; } + + [JsonProperty("update_time")] + public long? Update_time { get; set; } + + + } + + public class GetCgiWritingContentResponse + { + [JsonProperty("news_item")] + public List<GetCgiWritingNewItemResponse> News_item { get; set; } + + [JsonProperty("create_time")] + public long? Create_time { get; set; } + + [JsonProperty("update_time")] + public long? Update_time { get; set; } + + } + + public class GetCgiWritingNewItemResponse + { + [JsonProperty("title")] + public string Title { get; set; } + + [JsonProperty("author")] + public string Author { get; set; } + + [JsonProperty("digest")] + public string Digest { get; set; } + + [JsonProperty("content")] + public string Content { get; set; } + + [JsonProperty("content_source_url")] + public string Content_source_url { get; set; } + + [JsonProperty("thumb_media_id")] + public string thumb_media_id { get; set; } + + [JsonProperty("thumb_url")] + public string Thumb_url { get; set; } + + [JsonProperty("show_cover_pic")] + public string show_cover_pic { get; set; } + + [JsonProperty("need_open_comment")] + public string Meed_open_comment { get; set; } + + } +} \ No newline at end of file diff --git a/LifePayment/LifePayment.Domain.Shared/WeChat/WxMatchMakingMiniAppOption.cs b/LifePayment/LifePayment.Domain.Shared/WeChat/WxMatchMakingMiniAppOption.cs new file mode 100644 index 0000000..b4d1bf8 --- /dev/null +++ b/LifePayment/LifePayment.Domain.Shared/WeChat/WxMatchMakingMiniAppOption.cs @@ -0,0 +1,36 @@ +锘縩amespace LifePayment.Domain.Shared +{ + public class WxMatchMakingMiniAppOption + { + /// <summary> + /// 灏忕▼搴忕増鏈�傛寮忕増涓� "release"锛屼綋楠岀増涓� "trial"锛屽紑鍙戠増涓� "develop" + /// </summary> + public string EnvVersion { get; set; } = "release"; + + /// <summary> + /// 鎵爜娉ㄥ唽/鐧诲綍鍏ュ彛椤� + /// </summary> + public string SignUpPage { get; set; } + + /// <summary> + /// 灏忕▼搴廇ppId + /// </summary> + public string AppId { get; set; } + + /// <summary> + /// 灏忕▼搴廠ecret + /// </summary> + public string Secret { get; set; } + + /// <summary> + /// Url + /// </summary> + public string Url { get; set; } + + /// <summary> + /// 榛樿鏄痶rue锛屾鏌age 鏄惁瀛樺湪锛屼负 true 鏃� page 蹇呴』鏄凡缁忓彂甯冪殑灏忕▼搴忓瓨鍦ㄧ殑椤甸潰锛堝惁鍒欐姤閿欙級锛� + /// 涓� false 鏃跺厑璁稿皬绋嬪簭鏈彂甯冩垨鑰� page 涓嶅瓨鍦紝 浣唒age 鏈夋暟閲忎笂闄愶紙60000涓級璇峰嬁婊ョ敤銆� + /// </summary> + public bool CheckPath { get; set; } = true; + } +} \ No newline at end of file diff --git a/LifePayment/LifePayment.Domain.Shared/WeChat/WxMiniAppOption.cs b/LifePayment/LifePayment.Domain.Shared/WeChat/WxMiniAppOption.cs new file mode 100644 index 0000000..8b3cec8 --- /dev/null +++ b/LifePayment/LifePayment.Domain.Shared/WeChat/WxMiniAppOption.cs @@ -0,0 +1,36 @@ +锘縩amespace LifePayment.Domain.Shared +{ + public class WxMiniAppOption + { + /// <summary> + /// 灏忕▼搴忕増鏈�傛寮忕増涓� "release"锛屼綋楠岀増涓� "trial"锛屽紑鍙戠増涓� "develop" + /// </summary> + public string EnvVersion { get; set; } = "release"; + + /// <summary> + /// 鎵爜娉ㄥ唽/鐧诲綍鍏ュ彛椤� + /// </summary> + public string SignUpPage { get; set; } + + /// <summary> + /// 灏忕▼搴廇ppId + /// </summary> + public string AppId { get; set; } + + /// <summary> + /// 灏忕▼搴廠ecret + /// </summary> + public string Secret { get; set; } + + /// <summary> + /// Url + /// </summary> + public string Url { get; set; } + + /// <summary> + /// 榛樿鏄痶rue锛屾鏌age 鏄惁瀛樺湪锛屼负 true 鏃� page 蹇呴』鏄凡缁忓彂甯冪殑灏忕▼搴忓瓨鍦ㄧ殑椤甸潰锛堝惁鍒欐姤閿欙級锛� + /// 涓� false 鏃跺厑璁稿皬绋嬪簭鏈彂甯冩垨鑰� page 涓嶅瓨鍦紝 浣唒age 鏈夋暟閲忎笂闄愶紙60000涓級璇峰嬁婊ョ敤銆� + /// </summary> + public bool CheckPath { get; set; } = true; + } +} \ No newline at end of file diff --git a/LifePayment/LifePayment.Domain.Shared/WeChat/WxMiniTokenInfo.cs b/LifePayment/LifePayment.Domain.Shared/WeChat/WxMiniTokenInfo.cs new file mode 100644 index 0000000..13ed5ed --- /dev/null +++ b/LifePayment/LifePayment.Domain.Shared/WeChat/WxMiniTokenInfo.cs @@ -0,0 +1,19 @@ +锘縰sing Newtonsoft.Json; + +namespace LifePayment.Domain.Shared +{ + public class WxMiniTokenInfo + { + /// <summary> + /// 鑾峰彇鍒扮殑鍑瘉 + /// </summary> + [JsonProperty("access_token")] + public string AccessToken { get; set; } + + /// <summary> + /// 鍑瘉鏈夋晥鏃堕棿锛屽崟浣嶏細绉掋�傜洰鍓嶆槸7200绉掍箣鍐呯殑鍊笺�� + /// </summary> + [JsonProperty("expires_in")] + public int ExpiresIn { get; set; } + } +} \ No newline at end of file diff --git a/LifePayment/LifePayment.Domain.Shared/WeChat/WxPayOption.cs b/LifePayment/LifePayment.Domain.Shared/WeChat/WxPayOption.cs new file mode 100644 index 0000000..a69de04 --- /dev/null +++ b/LifePayment/LifePayment.Domain.Shared/WeChat/WxPayOption.cs @@ -0,0 +1,45 @@ +锘縩amespace LifePayment.Domain.Shared +{ + public class WxPayOption + { + /// <summary> + /// 鍟嗘埛ID + /// </summary> + public string Mchid { get; set; } + + /// <summary> + /// 璇锋眰鍦板潃 + /// </summary> + public string Url { get; set; } + + /// <summary> + /// AppId + /// </summary> + public string AppID { get; set; } + + /// <summary> + /// ApiKey + /// </summary> + public string APIKey { get; set; } + + /// <summary> + /// 寰俊骞冲彴绉侀挜 + /// </summary> + public string APIPrivateKey { get; set; } + + /// <summary> + /// 寰俊骞冲彴鍏挜 + /// </summary> + public string APIPublicKey { get; set; } + + /// <summary> + /// 鍟嗘埛璇佷功搴忓垪鍙� + /// </summary> + public string SerialNo { get; set; } + + /// <summary> + /// 鍥炶皟鍦板潃 + /// </summary> + public string NotifyUrl { get; set; } + } +} \ No newline at end of file diff --git a/LifePayment/LifePayment.Domain.Shared/WeChat/WxPayPostBaseModel.cs b/LifePayment/LifePayment.Domain.Shared/WeChat/WxPayPostBaseModel.cs new file mode 100644 index 0000000..6663b7e --- /dev/null +++ b/LifePayment/LifePayment.Domain.Shared/WeChat/WxPayPostBaseModel.cs @@ -0,0 +1,597 @@ +锘縰sing Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; + +namespace LifePayment.Domain.Shared +{ + public class WxPayPostBaseModel + { + /// <summary> + /// 搴旂敤ID + /// </summary> + [JsonProperty("appid")] + [Required] + public string Appid { get; set; } + + /// <summary> + /// 鐩磋繛鍟嗘埛鍙� + /// </summary> + [JsonProperty("mchid")] + [Required] + public string Mchid { get; set; } + } + + public class CertificatesReponse + { + [JsonProperty("data")] + public List<CertificatesReponseDetail> Data { get; set; } + } + + public class CertificatesReponseDetail + { + [JsonProperty("serial_no")] + public string SerialNo { get; set; } + + [JsonProperty("effective_time")] + public string EffectiveTime { get; set; } + + [JsonProperty("expire_time")] + public string ExpireTime { get; set; } + + [JsonProperty("encrypt_certificate")] + public EncryptCertificate EncryptCertificate { get; set; } + } + + public class EncryptCertificate + { + [JsonProperty("algorithm")] + public string Algorithm { get; set; } + + [JsonProperty("nonce")] + public string Nonce { get; set; } + + [JsonProperty("associated_data")] + public string AssociatedData { get; set; } + + [JsonProperty("ciphertext")] + public string Ciphertext { get; set; } + } + + public class WxPayGetBaseModel + { + /// <summary> + /// 鐩磋繛鍟嗘埛鍙� + /// </summary> + [JsonProperty("mchid")] + [Required] + [Query] + public string Mchid { get; set; } + } + + public class PayTransactionsNativeInput : WxPayPostBaseModel + { + /// <summary> + /// 鍟嗗搧鎻忚堪 + /// </summary> + [JsonProperty("description")] + [Required] + public string Description { get; set; } + + /// <summary> + /// 鍟嗘埛璁㈠崟鍙� + /// </summary> + [JsonProperty("out_trade_no")] + [Required] + public string OutTradeNo { get; set; } + + /// <summary> + /// 浜ゆ槗缁撴潫鏃堕棿 + /// </summary> + [JsonProperty("time_expire", NullValueHandling = NullValueHandling.Ignore)] + public string TimeExpire { get; set; } + + /// <summary> + /// 闄勫姞鏁版嵁 + /// </summary> + [JsonProperty("attach", NullValueHandling = NullValueHandling.Ignore)] + public string Attach { get; set; } + + /// <summary> + /// 閫氱煡鍦板潃 + /// </summary> + [JsonProperty("notify_url")] + [Required] + public string NotifyUrl { get; set; } + + /// <summary> + /// 璁㈠崟浼樻儬鏍囪 + /// </summary> + [JsonProperty("goods_tag", NullValueHandling = NullValueHandling.Ignore)] + public string GoodsTag { get; set; } + + /// <summary> + /// 璁㈠崟閲戦 + /// </summary> + [JsonProperty("amount")] + [Required] + public PayAmount Amount { get; set; } + } + + public class PayTransactionsNativeH5 : WxPayPostBaseModel + { + /// <summary> + /// 鍟嗗搧鎻忚堪 + /// </summary> + [JsonProperty("description")] + [Required] + public string Description { get; set; } + + /// <summary> + /// 鍟嗘埛璁㈠崟鍙� + /// </summary> + [JsonProperty("out_trade_no")] + [Required] + public string OutTradeNo { get; set; } + + /// <summary> + /// 浜ゆ槗缁撴潫鏃堕棿 + /// </summary> + [JsonProperty("time_expire", NullValueHandling = NullValueHandling.Ignore)] + public string TimeExpire { get; set; } + + /// <summary> + /// 闄勫姞鏁版嵁 + /// </summary> + [JsonProperty("attach", NullValueHandling = NullValueHandling.Ignore)] + public string Attach { get; set; } + + /// <summary> + /// 閫氱煡鍦板潃 + /// </summary> + [JsonProperty("notify_url")] + [Required] + public string NotifyUrl { get; set; } + + /// <summary> + /// 璁㈠崟浼樻儬鏍囪 + /// </summary> + [JsonProperty("goods_tag", NullValueHandling = NullValueHandling.Ignore)] + public string GoodsTag { get; set; } + + /// <summary> + /// 璁㈠崟閲戦 + /// </summary> + [JsonProperty("amount")] + [Required] + public PayAmount Amount { get; set; } + + [JsonProperty("scene_info")] + public H5SceneInfo SceneInfo { get; set; } + } + + public class PayAmount + { + /// <summary> + /// 璁㈠崟鎬婚噾棰濓紝鍗曚綅涓哄垎銆� + /// </summary> + [JsonProperty("total")] + [Required] + public int Total { get; set; } + + /// <summary> + /// 璐у竵绫诲瀷 CNY锛氫汉姘戝竵锛屽鍐呭晢鎴峰彿浠呮敮鎸佷汉姘戝竵銆� + /// </summary> + [JsonProperty("currency")] + public string Currency { get; set; } = "CNY"; + } + + public class H5SceneInfo + { + /// <summary> + /// 鐢ㄦ埛缁堢IP + /// </summary> + [JsonProperty("payer_client_ip")] + public string PayerClientIp { get; set; } + + [JsonProperty("h5_info")] + public H5Info H5Info { get; set; } + } + + public class H5Info + { + /// <summary> + /// 鍦烘櫙绫诲瀷 + /// </summary> + [JsonProperty("type")] + public string Type { get; set; } + } + + public class PayTransactionsNativeReponse + { + /// <summary> + /// 浜岀淮鐮侀摼鎺� + /// </summary> + [JsonProperty("code_url")] + public string CodeUrl { get; set; } + + /// <summary> + /// 閿欒鐮� + /// </summary> + [JsonProperty("code")] + public string Code { get; set; } + + /// <summary> + /// 璇存槑淇℃伅 + /// </summary> + [JsonProperty("message")] + public string Message { get; set; } + } + + public class PayTransactionsH5Reponse + { + /// <summary> + /// 浜岀淮鐮侀摼鎺� + /// </summary> + [JsonProperty("h5_url")] + public string H5Url { get; set; } + + /// <summary> + /// 閿欒鐮� + /// </summary> + [JsonProperty("code")] + public string Code { get; set; } + + /// <summary> + /// 璇存槑淇℃伅 + /// </summary> + [JsonProperty("message")] + public string Message { get; set; } + } + + public class PayTransactionsInput : WxPayGetBaseModel + { + /// <summary> + /// 鍟嗘埛璁㈠崟鍙� + /// </summary> + [JsonProperty("out-trade-no")] + [Required] + [Path] + public string OutTradeNo { get; set; } + } + + public class PayTransactionsReponse + { + /// <summary> + /// 搴旂敤ID + /// </summary> + [JsonProperty("appid")] + public string Appid { get; set; } + + /// <summary> + /// 鐩磋繛鍟嗘埛鍙� + /// </summary> + [JsonProperty("mchid")] + public string Mchid { get; set; } + + /// <summary> + /// 鍟嗘埛璁㈠崟鍙� + /// </summary> + [JsonProperty("out_trade_no")] + public string OutTradeNo { get; set; } + + /// <summary> + /// 寰俊鏀粯璁㈠崟鍙� + /// </summary> + [JsonProperty("transaction_id")] + public string TransactionId { get; set; } + + /// <summary> + /// 浜ゆ槗绫诲瀷 + /// </summary> + [JsonProperty("trade_type")] + public string TradeType { get; set; } + + /// <summary> + /// 浜ゆ槗鐘舵�� + /// </summary> + [JsonProperty("trade_state")] + public string TradeState { get; set; } + + /// <summary> + /// 浜ゆ槗鐘舵�佹弿杩� + /// </summary> + [JsonProperty("trade_state_desc")] + public string TradeStateDesc { get; set; } + + /// <summary> + /// 浠樻閾惰 + /// </summary> + [JsonProperty("bank_type")] + public string BankType { get; set; } + + /// <summary> + /// 闄勫姞鏁版嵁 + /// </summary> + [JsonProperty("attach")] + public string Attach { get; set; } + + /// <summary> + /// 鏀粯瀹屾垚鏃堕棿 + /// </summary> + [JsonProperty("success_time")] + public string SuccessTime { get; set; } + + /// <summary> + /// 鏀粯鑰� + /// </summary> + [JsonProperty("payer")] + public Payer Payer { get; set; } + + /// <summary> + /// 璁㈠崟閲戦 + /// </summary> + [JsonProperty("amount")] + public Amount Amount { get; set; } + + /// <summary> + /// 鍦烘櫙淇℃伅 + /// </summary> + [JsonProperty("scene_info")] + public SceneInfo SceneInfo { get; set; } + + /// <summary> + /// 浼樻儬鍔熻兘 + /// </summary> + [JsonProperty("promotion_detail")] + public List<PromotionDetail> PromotionDetail { get; set; } + } + public class Payer + { + /// <summary> + /// 鐢ㄦ埛鏍囪瘑 + /// </summary> + [JsonProperty("openid")] + [Required] + public string Openid { get; set; } + } + + public class Amount + { + /// <summary> + /// 鎬婚噾棰� + /// </summary> + [JsonProperty("total", NullValueHandling = NullValueHandling.Ignore)] + [Required] + public int Total { get; set; } + + /// <summary> + /// 鐢ㄦ埛鏀粯閲戦 + /// </summary> + [JsonProperty("payer_total", NullValueHandling = NullValueHandling.Ignore)] + [Required] + public int PayerTotal { get; set; } + + /// <summary> + /// 璐у竵绫诲瀷 + /// </summary> + [JsonProperty("currency", NullValueHandling = NullValueHandling.Ignore)] + [Required] + public string Currency { get; set; } + + /// <summary> + /// 鐢ㄦ埛鏀粯甯佺 + /// </summary> + [JsonProperty("payer_currency", NullValueHandling = NullValueHandling.Ignore)] + [Required] + public string PayerCurrency { get; set; } + } + + public class SceneInfo + { + /// <summary> + /// 鍟嗘埛绔澶囧彿 + /// </summary> + [JsonProperty("device_id", NullValueHandling = NullValueHandling.Ignore)] + [Required] + public string DeviceId { get; set; } + } + + public class PromotionDetail + { + /// <summary> + /// 鍒窱D + /// </summary> + [JsonProperty("coupon_id")] + public string CouponId { get; set; } + + /// <summary> + /// 浼樻儬鍚嶇О + /// </summary> + [JsonProperty("name")] + public string Name { get; set; } + + /// <summary> + /// 浼樻儬鑼冨洿 + /// </summary> + [JsonProperty("scope")] + public string Scope { get; set; } + + /// <summary> + /// 浼樻儬绫诲瀷 + /// </summary> + [JsonProperty("type")] + public string Type { get; set; } + + /// <summary> + /// 浼樻儬鍒搁潰棰� + /// </summary> + [JsonProperty("amount")] + public int Amount { get; set; } + + /// <summary> + /// 娲诲姩ID + /// </summary> + [JsonProperty("stock_id")] + public string StockId { get; set; } + + /// <summary> + /// 寰俊鍑鸿祫 + /// </summary> + [JsonProperty("wechatpay_contribute")] + public int WechatpayContribute { get; set; } + + /// <summary> + /// 鍟嗘埛鍑鸿祫 + /// </summary> + [JsonProperty("merchant_contribute")] + public int MerchantContribute { get; set; } + + /// <summary> + /// 鍏朵粬鍑鸿祫 + /// </summary> + [JsonProperty("other_contribute")] + public int OtherContribute { get; set; } + + /// <summary> + /// 浼樻儬甯佺 + /// </summary> + [JsonProperty("currency")] + public string Currency { get; set; } + + /// <summary> + /// 鍗曞搧鍒楄〃 + /// </summary> + [JsonProperty("goods_detail")] + public GoodsDetail GoodsDetail { get; set; } + } + + public class GoodsDetail + { + /// <summary> + /// 鍟嗗搧缂栫爜 + /// </summary> + [JsonProperty("goods_id")] + public string GoodsId { get; set; } + + /// <summary> + /// 鍟嗗搧鏁伴噺 + /// </summary> + [JsonProperty("quantity")] + public int Quantity { get; set; } + + /// <summary> + /// 鍟嗗搧鍗曚环 + /// </summary> + [JsonProperty("unit_price")] + public int UnitPrice { get; set; } + + /// <summary> + /// 鍟嗗搧浼樻儬閲戦 + /// </summary> + [JsonProperty("discount_amount")] + public int DiscountAmount { get; set; } + + /// <summary> + /// 鍟嗗搧澶囨敞 + /// </summary> + [JsonProperty("goods_remark")] + public string GoodsRemark { get; set; } + } + + public class QueryAttribute : Attribute + { + } + + public class PathAttribute : Attribute + { + } + + public class ModelPaymentMiniPay + { + public string NonceStr { get; set; } + public string Package { get; set; } + public string SignType { get; set; } + public string PaySign { get; set; } + public string Timestamp { get; set; } + + /// <summary> + /// 璁㈠崟澶辨晥鏃堕棿 + /// </summary> + public string TimeExpire { get; set; } + /// <summary> + /// 閿欒淇℃伅 + /// </summary> + public string Message { get; set; } + } + + /// <summary> + /// 灏忕▼搴忔敮浠樿姹� + /// </summary> + public class ModelMiniPayRequest : WxPayPostBaseModel + { + + + [JsonProperty("out_trade_no")] + public string OutTradeNo { get; set; } + + + + [JsonProperty("description")] + public string Description { get; set; } + + [JsonProperty("notify_url")] + public string NotifyUrl { get; set; } + + [JsonProperty("attach")] + public string Attach { get; set; } + + [JsonProperty("time_expire")] + public string TimeExpire { get; set; } + + [JsonProperty("amount")] + public Model_MiniPay_Amount Amount { get; set; } + + [JsonProperty("payer")] + public Model_MiniPay_Payer Payer { get; set; } + } + + /// <summary> + /// 璁㈠崟閲戦淇℃伅 + /// </summary> + public class Model_MiniPay_Amount + { + [JsonProperty("total")] + public int Total { get; set; } + + [JsonProperty("currency")] + public string Currency { get; set; } + } + /// <summary> + /// 鏀粯鑰呬俊鎭� + /// </summary> + public class Model_MiniPay_Payer + { + [JsonProperty("openid")] + public string OpenId { get; set; } + } + + public class ModelPayPrePayId + { + [JsonProperty("prepay_id")] + public string PrepayId { get; set; } + + [JsonProperty("code")] + public string Code { get; set; } + + [JsonProperty("message")] + public string Message { get; set; } + } + + public class LifePayJsAPIRequest + { + public string OpenId { get; set; } + + public string Attach { get; set; } + } +} \ No newline at end of file diff --git a/LifePayment/LifePayment.Domain.Shared/WeChat/WxPaySignAuthenticationDefaults.cs b/LifePayment/LifePayment.Domain.Shared/WeChat/WxPaySignAuthenticationDefaults.cs new file mode 100644 index 0000000..4e3c728 --- /dev/null +++ b/LifePayment/LifePayment.Domain.Shared/WeChat/WxPaySignAuthenticationDefaults.cs @@ -0,0 +1,7 @@ +锘縩amespace LifePayment.Domain.Shared +{ + public class WxPaySignAuthenticationDefaults + { + public const string AuthenticationScheme = "WxPaySignScheme"; + } +} \ No newline at end of file diff --git a/LifePayment/LifePayment.Domain/ACOOLY/ACOOLYClient.cs b/LifePayment/LifePayment.Domain/ACOOLY/ACOOLYClient.cs new file mode 100644 index 0000000..1c0c8fe --- /dev/null +++ b/LifePayment/LifePayment.Domain/ACOOLY/ACOOLYClient.cs @@ -0,0 +1,107 @@ +锘縰sing LifePayment.Application.Contracts; +using LifePayment.Domain.Shared; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; +using Newtonsoft.Json; +using System; +using System.Collections; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Net.Http; +using System.Reflection; +using System.Security.Cryptography; +using System.Security.Policy; +using System.Text; +using System.Threading.Tasks; +using System.Web; +using Volo.Abp.Application.Services; +using Volo.Abp.Domain.Services; +using ZeroD.Util; +using ZeroD.Util.Fadd; + +namespace LifePayment.Domain +{ + public class ACOOLYClient : DomainService + { + private const string ACOOLYClientName = "ACOOLYClientName"; + private readonly ILogger<ACOOLYClient> _logger; + private readonly ACOOLYOption options; + private readonly JsonSerializerSettings jsonSetting = new JsonSerializerSettings + { + NullValueHandling = NullValueHandling.Ignore + }; + + public ACOOLYClient(ILogger<ACOOLYClient> logger, IOptionsMonitor<ACOOLYOption> optionsMonitor) + { + _logger = logger; + options = optionsMonitor.CurrentValue; + } + + protected IHttpClientFactory HttpClientFactory => LazyServiceProvider.LazyGetRequiredService<IHttpClientFactory>(); + + public async Task<TResult> PostAsync<TInput, TResult>(TInput input) + { + try + { + var client = HttpClientFactory.CreateClient(ACOOLYClientName); + client.DefaultRequestHeaders.Add("x-api-accesskey", options.Accesskey); + client.DefaultRequestHeaders.Add("x-api-signType", "MD5"); + // ToDo 鍙傛暟鍙兘瀛樺湪鎺掑簭鍚庡啀鍔犲瘑锛岄渶瑕佽仈璋冪‘璁� + var body = JsonConvert.SerializeObject(input, jsonSetting); + if (body.Length < 2000) + { + _logger.LogError("璇锋眰ACOOLY鎺ュ彛锛�" + body); + } + var data = new StringContent(body, Encoding.UTF8, "application/json"); + data.Headers.Add("x-api-sign", GetMD5Data(body)); + var responseMessage = await client.PostAsync(options.ServerHost, data); + var str = await responseMessage.Content.ReadAsStringAsync(); + if (!body.Contains(ACOOLYConstant.Sevice.ElectricSupportArea)) + { + _logger.LogError("ACOOLY鎺ュ彛杩斿洖锛�" + str); + } + + var result = JsonConvert.DeserializeObject<TResult>(str); + + return result; + } + catch (Exception ex) + { + _logger.LogError("ACOOLY鎺ュ彛閿欒锛�" + ex.Message); + return default(TResult); + } + + } + + public string GetMD5Data(string jsonData) //POST璇锋眰鎺ュ彛锛屼娇鐢ㄦ鏂规硶璁$畻绛惧悕 + { + string dataMD5 = ""; + if (!string.IsNullOrEmpty(jsonData)) + { + var str = jsonData + options.SecrtKey; + dataMD5 = CreateMD5Hash(str); + } + + return dataMD5; + } + + #region 绉佹湁鏂规硶 + + private string CreateMD5Hash(string input) + { + MD5 md5 = System.Security.Cryptography.MD5.Create(); + byte[] inputBytes = System.Text.Encoding.UTF8.GetBytes(input); + byte[] hashBytes = md5.ComputeHash(inputBytes); + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < hashBytes.Length; i++) + { + sb.Append(hashBytes[i].ToString("x2")); + } + + return sb.ToString(); + } + #endregion + } + +} diff --git a/LifePayment/LifePayment.Domain/ACOOLY/ACOOLYManager.cs b/LifePayment/LifePayment.Domain/ACOOLY/ACOOLYManager.cs new file mode 100644 index 0000000..be502bc --- /dev/null +++ b/LifePayment/LifePayment.Domain/ACOOLY/ACOOLYManager.cs @@ -0,0 +1,261 @@ +锘縰sing LifePayment.Application; +using LifePayment.Application.Contracts; +using LifePayment.Domain.Shared; +using Microsoft.AspNetCore.Components.Forms; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Volo.Abp.Domain.Services; +using Volo.Abp.Users; +using ZeroD.Util.Fadd; + +namespace LifePayment.Domain; + +public class ACOOLYManager : ACOOLYClient, IACOOLYManager +{ + private readonly ILogger<ACOOLYClient> _logger; + private readonly ACOOLYOption _options; + + public ACOOLYManager(ILogger<ACOOLYClient> logger, IOptionsMonitor<ACOOLYOption> optionsMonitor) : base(logger, optionsMonitor) + { + _logger = logger; + _options = optionsMonitor.CurrentValue; + } + + #region 鐕冩皵 + + /// <summary> + /// 鑾峰彇鐕冩皵闈㈠�� + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + public async Task<GasParValueResponse> GasParValue(GasParValueRequestInput input) + { + SetBaseInfo(input, ACOOLYConstant.Sevice.GasParValue); + return await PostAsync<GasParValueRequestInput, GasParValueResponse>(input); + } + + /// <summary> + /// 鎻愪氦鐕冩皵璁㈠崟 + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + public async Task<ConfirmGasOrderResponse> ConfirmGasOrder(ConfirmGasOrderRequestInput input) + { + SetBaseInfo(input, ACOOLYConstant.Sevice.ConfirmGasOrder); + return await PostAsync<ConfirmGasOrderRequestInput, ConfirmGasOrderResponse>(input); + } + + #endregion + + #region 鐢佃垂 + + /// <summary> + /// 鑾峰彇鐢佃垂闈㈠�� + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + public async Task<ElectricParValueResponse> ElectricParValue(ACOOLYRequestBaseInput input) + { + SetBaseInfo(input, ACOOLYConstant.Sevice.ElectricParValue); + +#if DEBUG + + //return new ElectricParValueResponse + //{ + // Code = ACOOLYConstant.Code.SUCCESS, + // ElectricParValue = new List<ElectricParValueOutput>() + // { + // new ElectricParValueOutput() + // { + // AreaName = "鍖椾含", + // Comments = "娴嬭瘯鏁版嵁", + // ElectricType = "guowang", + // ParValue = "100,200,300", + // Rate = 0.93m + // }, + + // new ElectricParValueOutput() + // { + // AreaName = "涓婃捣", + // Comments = "娴嬭瘯鏁版嵁", + // ElectricType = "nanwang", + // ParValue = "100,200,300", + // Rate = 0.93m + // } + + // }, + // RequestNo = input.RequestNo, + // Service = input.Service, + // PartnerId = input.PartnerId, + // Success = "true", + //}; + +#endif + + return await PostAsync<ACOOLYRequestBaseInput, ElectricParValueResponse>(input); + } + + /// <summary> + /// 鑾峰彇鐢佃垂鍏呭�煎尯鍩� + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + public async Task<ElectricSupportAreaResponse> GetElectricSupportArea(ACOOLYRequestBaseInput input) + { + SetBaseInfo(input, ACOOLYConstant.Sevice.ElectricSupportArea); + + return await PostAsync<ACOOLYRequestBaseInput, ElectricSupportAreaResponse>(input); + } + + /// <summary> + /// 鎻愪氦鐢佃垂璁㈠崟 + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + public async Task<ConfirmElectricOrderResponse> ConfirmElectricOrder(ConfirmElectricOrderRequestInput input) + { + SetBaseInfo(input, ACOOLYConstant.Sevice.ConfirmElectricOrder); + +#if DEBUG + + //return new ConfirmElectricOrderResponse + //{ + // Code = ACOOLYConstant.Code.PROCESSING, + // ElectricChargeOrder = new ElectricChargeOrderOutput + // { + // AreaName = input.Province, + // ElectricAccount = input.ElectricAccount, + // ElectricType = input.ElectricType, + // OutOrderNo = input.OutOrderNo, + // BusiOrderNo = "Test000000001", + // ParValue = input.ParValue, + // PayAmount = input.ParValue, + // Status = ACOOLYConstant.Code.PROCESSING, + // StatusText = "澶勭悊涓�" + // }, + // RequestNo = input.RequestNo, + // Service = input.Service, + // PartnerId = input.PartnerId, + // Success = true, + //}; + +#endif + + return await PostAsync<ConfirmElectricOrderRequestInput, ConfirmElectricOrderResponse>(input); + } + + #endregion + + #region 璇濊垂 + + /// <summary> + /// 鑾峰彇璇濊垂闈㈠�� + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + public async Task<PhoneParValueResponse> PhoneParValue(ACOOLYRequestBaseInput input) + { + SetBaseInfo(input, ACOOLYConstant.Sevice.PhoneParValue); + +#if DEBUG + + //return new PhoneParValueResponse + //{ + // Code = ACOOLYConstant.Code.SUCCESS, + // PhoneParValue = new List<PhoneParValueOutput>() + // { + // new PhoneParValueOutput() + // { + // IspCode="yidong", + // IspName="绉诲姩", + // PhoneSection="", + // Comments= "娴嬭瘯鏁版嵁", + // ParValue = "100,200,300", + // Rate = 0.93m + // }, + + // new PhoneParValueOutput() + // { + // IspCode="dianxin", + // IspName="鐢典俊", + // PhoneSection="", + // Comments= "娴嬭瘯鏁版嵁", + // ParValue = "100,200,300", + // Rate = 0.93m + // }, + + // new PhoneParValueOutput() + // { + // IspCode="liantong", + // IspName="鑱旈��", + // PhoneSection="", + // Comments= "娴嬭瘯鏁版嵁", + // ParValue = "100,200,300", + // Rate = 0.93m + // }, + // }, + // RequestNo = input.RequestNo, + // Service = input.Service, + // PartnerId = input.PartnerId, + // Success = true, + //}; + +#endif + + return await PostAsync<ACOOLYRequestBaseInput, PhoneParValueResponse>(input); + } + + /// <summary> + /// 鎻愪氦璇濊垂璁㈠崟 + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + public async Task<ConfirmPhoneOrderResponse> ConfirmPhoneOrder(ConfirmPhoneOrderRequestInput input) + { + SetBaseInfo(input, ACOOLYConstant.Sevice.ConfirmPhoneOrder); + +#if DEBUG + + //return new ConfirmPhoneOrderResponse + //{ + // Code = ACOOLYConstant.Code.PROCESSING, + // PhoneChargeOrder = new PhoneChargeOrderOutput() + // { + // OutOrderNo = input.OutOrderNo, + // BusiOrderNo = "Test000000001", + // ParValue = input.ParValue, + // PayAmount = input.ParValue, + // Status = ACOOLYConstant.Code.PROCESSING, + // StatusText = "澶勭悊涓�", + // }, + // RequestNo = input.RequestNo, + // Service = input.Service, + // PartnerId = input.PartnerId, + // Success = true, + //}; + +#endif + + return await PostAsync<ConfirmPhoneOrderRequestInput, ConfirmPhoneOrderResponse>(input); + } + + #endregion + + #region 绉佹湁 + + private void SetBaseInfo(ACOOLYRequestBaseInput input, string service) + { + input.RequestNo = GuidGenerator.Create().ToString(); + input.Service = service; + input.PartnerId = _options.PartnerId; + input.NotifyUrl = _options.NotifyUrl + ACOOLYConstant.NotifyUrl; + } + + #endregion + +} diff --git a/LifePayment/LifePayment.Domain/ACOOLY/IACOOLYManager.cs b/LifePayment/LifePayment.Domain/ACOOLY/IACOOLYManager.cs new file mode 100644 index 0000000..f5e865b --- /dev/null +++ b/LifePayment/LifePayment.Domain/ACOOLY/IACOOLYManager.cs @@ -0,0 +1,75 @@ +锘縰sing LifePayment.Domain.Shared; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Volo.Abp.Domain.Services; + +namespace LifePayment.Domain; + +public interface IACOOLYManager +{ + + #region 鐕冩皵 + + /// <summary> + /// 鑾峰彇鐕冩皵闈㈠�� + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + Task<GasParValueResponse> GasParValue(GasParValueRequestInput input); + + /// <summary> + /// 鎻愪氦鐕冩皵璁㈠崟 + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + Task<ConfirmGasOrderResponse> ConfirmGasOrder(ConfirmGasOrderRequestInput input); + + #endregion + + #region 鐢佃垂 + + /// <summary> + /// 鑾峰彇鐢佃垂闈㈠�� + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + Task<ElectricParValueResponse> ElectricParValue(ACOOLYRequestBaseInput input); + + /// <summary> + /// 鑾峰彇鐢佃垂鍏呭�煎尯鍩� + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + Task<ElectricSupportAreaResponse> GetElectricSupportArea(ACOOLYRequestBaseInput input); + + /// <summary> + /// 鎻愪氦鐢佃垂璁㈠崟 + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + Task<ConfirmElectricOrderResponse> ConfirmElectricOrder(ConfirmElectricOrderRequestInput input); + + #endregion + + #region 璇濊垂 + + /// <summary> + /// 鑾峰彇璇濊垂闈㈠�� + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + Task<PhoneParValueResponse> PhoneParValue(ACOOLYRequestBaseInput input); + + /// <summary> + /// 鎻愪氦璇濊垂璁㈠崟 + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + Task<ConfirmPhoneOrderResponse> ConfirmPhoneOrder(ConfirmPhoneOrderRequestInput input); + + #endregion + +} diff --git a/LifePayment/LifePayment.Domain/Ali/AliPayApi.cs b/LifePayment/LifePayment.Domain/Ali/AliPayApi.cs new file mode 100644 index 0000000..40ccd7c --- /dev/null +++ b/LifePayment/LifePayment.Domain/Ali/AliPayApi.cs @@ -0,0 +1,37 @@ +锘縰sing Alipay.EasySDK.Factory; +using Alipay.EasySDK.Kernel; +using Alipay.EasySDK.Payment.Common.Models; +using Alipay.EasySDK.Payment.FaceToFace.Models; +using LifePayment.Domain.Shared; +using Microsoft.Extensions.Options; +using System.Threading.Tasks; + +namespace LifePayment.Domain +{ + public class AliPayApi : IAliPayApi + { + private readonly Config _options; + + public AliPayApi( + IOptionsMonitor<Config> optionsMonitor) + { + _options = optionsMonitor.CurrentValue; + } + + public async Task<AlipayTradePrecreateResponse> GetAliPayQRCode(GetPayQrCodeInput input) + { + AlipayTradePrecreateResponse response = Factory.Payment.FaceToFace() + .AsyncNotify($"{_options.NotifyUrl}{LifePaymentConstant.AliRechargeNotifySectionUrl}") + .PreCreate(input.Subject, + input.OutTradeNo, + input.TotalAmount.ToString()); + return response; + } + + public AlipayTradeQueryResponse OrderInQuiry(OrderInQuiryInput input) + { + AlipayTradeQueryResponse response = Factory.Payment.Common().Query(input.OutTradeNo); + return response; + } + } +} \ No newline at end of file diff --git a/LifePayment/LifePayment.Domain/Ali/AliPayAuthenticationHandler.cs b/LifePayment/LifePayment.Domain/Ali/AliPayAuthenticationHandler.cs new file mode 100644 index 0000000..f87c90a --- /dev/null +++ b/LifePayment/LifePayment.Domain/Ali/AliPayAuthenticationHandler.cs @@ -0,0 +1,108 @@ +锘縰sing Alipay.AopSdk.Core.Util; +using Alipay.EasySDK.Kernel; +using LifePayment.Domain.Shared; +using Microsoft.AspNetCore.Authentication; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Http; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; +using Microsoft.Extensions.Primitives; +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.IdentityModel.Tokens.Jwt; +using System.Linq; +using System.Security.Authentication; +using System.Security.Claims; +using System.Text; +using System.Text.Encodings.Web; +using System.Threading.Tasks; +using ZeroD.Util; + +namespace LifePayment.Domain +{ + public class AliPayAuthenticationHandler : AuthenticationHandler<AuthenticationSchemeOptions> + { + private readonly IOptionsMonitor<Config> _optionsMonitor; + private Config _config; + + public AliPayAuthenticationHandler( + IOptionsMonitor<AuthenticationSchemeOptions> options, + ILoggerFactory logger, + UrlEncoder encoder, + ISystemClock clock, + IOptionsMonitor<Config> optionsMonitor) : base(options, logger, encoder, clock) + { + _optionsMonitor = optionsMonitor; + } + + protected async override Task<AuthenticateResult> HandleAuthenticateAsync() + { + string str = string.Empty; + Request.EnableBuffering(); + var bytes = new byte[Request.ContentLength ?? 0]; + var bt = 1; + while (bt > 0) + { + bt = await Request.Body.ReadAsync(bytes, 0, (int)(Request.ContentLength ?? 0)); + } + + str = Encoding.Default.GetString(bytes); + Logger.LogError("淇′换绛惧洖璋冮獙绛緖0}", str); + Request.Body.Position = 0; + if (!str.IsNullOrEmpty()) + { + var endPoint = Request.HttpContext.GetEndpoint(); + if (endPoint?.Metadata.GetMetadata<IAllowAnonymous>() != null) + { + return AuthenticateResult.Success(new AuthenticationTicket(new ClaimsPrincipal(), AliPaySignAuthenticationDefaults.AuthenticationScheme)); + } + + StringValues app_id; + var app_idSuccess = Request.Form.TryGetValue("app_id", out app_id); + if (!app_idSuccess) + { + return AuthenticateResult.Fail(new AuthenticationException("app_id涓嶅彲涓虹┖")); + } + + StringValues msg_method; + var msg_methodSuccess = Request.Form.TryGetValue("msg_method", out msg_method); + if (!msg_methodSuccess) + { + return AuthenticateResult.Fail(new AuthenticationException("msg_method涓嶅彲涓虹┖")); + } + + switch (msg_method) + { + case AliPayEcsignConstant.AliPayEcsignApiMethod.SignorderSigned: + _config = _optionsMonitor.Get(AliPayEcsignConstant.OptionsName); + break; + default: + _config = _optionsMonitor.CurrentValue; + break; + } + + SortedDictionary<string, string> dic = new SortedDictionary<string, string>(); + Request.Form.ToList().ForEach(r => + { + if (!r.Value.FirstOrDefault().IsNullOrEmpty()) + { + dic.Add(r.Key, r.Value); + } + }); + + Logger.LogError("淇′换绛惧洖璋冮獙绛�2{0}", dic.ObjectToJson()); + bool signVerified = AlipaySignature.RSACheckV1(dic, _config.AlipayPublicKey, "UTF-8", _config.SignType, false); + if (signVerified) + { + var claimIdentity = new ClaimsIdentity("AliPayIdentity"); + claimIdentity.AddClaim(new Claim(nameof(app_id), app_id)); + var principal = new ClaimsPrincipal(claimIdentity); + return AuthenticateResult.Success(new AuthenticationTicket(principal, AliPaySignAuthenticationDefaults.AuthenticationScheme)); + } + } + + return AuthenticateResult.Fail(new AuthenticationException("楠岀澶辫触")); + } + } +} \ No newline at end of file diff --git a/LifePayment/LifePayment.Domain/Ali/AliPayExtensions.cs b/LifePayment/LifePayment.Domain/Ali/AliPayExtensions.cs new file mode 100644 index 0000000..4710255 --- /dev/null +++ b/LifePayment/LifePayment.Domain/Ali/AliPayExtensions.cs @@ -0,0 +1,23 @@ +锘縰sing LifePayment.Domain.Shared; +using Microsoft.AspNetCore.Authentication; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace LifePayment.Domain +{ + public static class AliPayExtensions + { + public static AuthenticationBuilder AddAliPay(this AuthenticationBuilder builder) + { + return builder.AddScheme<AuthenticationSchemeOptions, + AliPayAuthenticationHandler>(AliPaySignAuthenticationDefaults.AuthenticationScheme, + "AliPaySignCheck", + op => + { + }); + } + } +} \ No newline at end of file diff --git a/LifePayment/LifePayment.Domain/Ali/AlipayApiClient.cs b/LifePayment/LifePayment.Domain/Ali/AlipayApiClient.cs new file mode 100644 index 0000000..4adc53c --- /dev/null +++ b/LifePayment/LifePayment.Domain/Ali/AlipayApiClient.cs @@ -0,0 +1,418 @@ +锘縰sing Alipay.EasySDK.Kernel; +using Alipay.EasySDK.Kernel.Util; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using System; +using System.Collections; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Reflection; +using System.Threading.Tasks; +using Tea; +using Volo.Abp.Domain.Services; +using ZeroD.Util; + +namespace LifePayment.Domain +{ + public class AlipayApiClient : DomainService + { + public const string SDKVERSION = "alipay-easysdk-net-2.0.0"; + protected Client _client; + private ILogger<AlipayApiClient> _logger; + + + public AlipayApiClient(IOptionsMonitor<Config> optionsMonitor, ILogger<AlipayApiClient> logger, string optionsName = null) + { + Context context = new Context(optionsName.IsNullOrEmpty() ? optionsMonitor.CurrentValue : optionsMonitor.Get(optionsName), SDKVERSION); + _logger = logger; + this._client = new Client(context); + } + + public async Task<TResult> Request<TInput, TResult>(TInput input, string methodName, string getMethod = "POST") + where TResult : class, new() + where TInput : class, new() + { + Dictionary<string, object> runtime_ = new Dictionary<string, object> + { + {"connectTimeout", 15000}, + {"readTimeout", 15000}, + {"retry", new Dictionary<string, int?> + { + {"maxAttempts", 0}, + }}, + }; + + TeaRequest _lastRequest = null; + Exception _lastException = null; + long _now = System.DateTime.Now.Millisecond; + int _retryTimes = 0; + while (TeaCore.AllowRetry((IDictionary)runtime_["retry"], _retryTimes, _now)) + { + if (_retryTimes > 0) + { + int backoffTime = TeaCore.GetBackoffTime((IDictionary)runtime_["backoff"], _retryTimes); + if (backoffTime > 0) + { + TeaCore.Sleep(backoffTime); + } + } + _retryTimes = _retryTimes + 1; + try + { + TeaRequest request_ = new TeaRequest(); + + Dictionary<string, object> bizParams = Parse2Dic(input); + var body = JsonConvert.SerializeObject(bizParams); + if (body.Length < 2000) + { + _logger.LogError("璇锋眰鏀粯瀹濇帴鍙o細" + methodName + "鍐呭涓猴細" + body); + } + + Dictionary<string, string> textParams = new Dictionary<string, string>() { }; + request_.Protocol = this._client.GetConfig("protocol"); + request_.Method = getMethod; + request_.Pathname = "/gateway.do"; + var test = this._client.GetConfig("merchantPrivateKey"); + request_.Headers = new Dictionary<string, string> + { + {"host", this._client.GetConfig("gatewayHost")}, + {"content-type", "application/x-www-form-urlencoded;charset=utf-8"}, + }; + var systemParams = this.GetSystemParams(methodName); + request_.Query = this._client.SortMap(TeaConverter.merge<string> + ( + new Dictionary<string, string>() + { + {"sign", this._client.Sign(systemParams, bizParams, textParams, this._client.GetConfig("merchantPrivateKey")) }, + }, + systemParams, + textParams + )); + request_.Body = TeaCore.BytesReadable(this._client.ToUrlEncodedRequestBody(bizParams)); + _lastRequest = request_; + TeaResponse response_ = await TeaCore.DoActionAsync(request_, runtime_); + + Dictionary<string, object> respMap = this._client.ReadAsJson(response_, methodName); + var responseBody = JsonConvert.SerializeObject(respMap); + if (responseBody.Length < 2000) + { + _logger.LogError("鏀粯瀹濊繑鍥炵粨鏋滐細" + methodName + "鍐呭涓猴細" + responseBody); + } + if (this._client.IsCertMode()) + { + if (this._client.Verify(respMap, this._client.ExtractAlipayPublicKey(this._client.GetAlipayCertSN(respMap)))) + { + return TeaModel.ToObject<TResult>(this._client.ToRespModel(respMap)); + } + } + else + { + if (this._client.Verify(respMap, this._client.GetConfig("alipayPublicKey"))) + { +#if DEBUG + // var respModel = this._client.ToRespModel(respMap); + // var resultObject = TeaModel.ToObject<TResult>(respModel); + +#endif + return TeaModel.ToObject<TResult>(this._client.ToRespModel(respMap)); + } + } + throw new TeaException(new Dictionary<string, string> + { + {"message", "楠岀澶辫触锛岃妫�鏌ユ敮浠樺疂鍏挜璁剧疆鏄惁姝g‘銆�"}, + }); + } + catch (Exception e) + { + if (TeaCore.IsRetryable(e)) + { + _lastException = e; + continue; + } + throw e; + } + } + + throw new TeaUnretryableException(_lastRequest, _lastException); + } + + public async Task<TResult> RequestWithFile<TInput, TResult>(TInput input, Dictionary<string, (string Name, byte[] Bytes)> fileParams, string methodName, string getMethod = "POST") + where TResult : class, new() + where TInput : class, new() + { + Dictionary<string, object> runtime_ = new Dictionary<string, object> + { + {"connectTimeout", 15000}, + {"readTimeout", 15000}, + {"retry", new Dictionary<string, int?> + { + {"maxAttempts", 0}, + }}, + }; + + TeaRequest _lastRequest = null; + Exception _lastException = null; + long _now = System.DateTime.Now.Millisecond; + int _retryTimes = 0; + while (TeaCore.AllowRetry((IDictionary)runtime_["retry"], _retryTimes, _now)) + { + if (_retryTimes > 0) + { + int backoffTime = TeaCore.GetBackoffTime((IDictionary)runtime_["backoff"], _retryTimes); + if (backoffTime > 0) + { + TeaCore.Sleep(backoffTime); + } + } + _retryTimes = _retryTimes + 1; + try + { + TeaRequest request_ = new TeaRequest(); + + Dictionary<string, object> bizParams = new Dictionary<string, object>(); + Dictionary<string, string> textParams = Parse2StrDic(input); + var body = JsonConvert.SerializeObject(textParams); + if (body.Length < 2000) + { + _logger.LogError("璇锋眰鏀粯瀹濇帴鍙o細" + methodName + "鍐呭涓猴細" + body); + } + request_.Protocol = this._client.GetConfig("protocol"); + request_.Method = getMethod; + request_.Pathname = "/gateway.do"; + var boundary = _client.GetRandomBoundary(); + var test = this._client.GetConfig("merchantPrivateKey"); + request_.Headers = new Dictionary<string, string> + { + {"host", this._client.GetConfig("gatewayHost")}, + {"content-type",_client.ConcatStr("multipart/form-data;charset=utf-8;boundary=", boundary)} + }; + var systemParams = this.GetSystemParams(methodName); + request_.Query = this._client.SortMap(TeaConverter.merge<string> + ( + new Dictionary<string, string>() + { + {"sign", this._client.Sign(systemParams, bizParams, textParams, this._client.GetConfig("merchantPrivateKey")) }, + }, + systemParams, + textParams + )); + //request_.Body = TeaCore.BytesReadable(this._client.ToUrlEncodedRequestBody(bizParams)); + request_.Body = ToMultipartRequestBody(textParams, fileParams, boundary); + _lastRequest = request_; + TeaResponse response_ = await TeaCore.DoActionAsync(request_, runtime_); + + Dictionary<string, object> respMap = this._client.ReadAsJson(response_, methodName); + var responseBody = JsonConvert.SerializeObject(respMap); + if (responseBody.Length < 2000) + { + _logger.LogError("鏀粯瀹濊繑鍥炵粨鏋滐細" + methodName + "鍐呭涓猴細" + responseBody); + } + if (this._client.IsCertMode()) + { + if (this._client.Verify(respMap, this._client.ExtractAlipayPublicKey(this._client.GetAlipayCertSN(respMap)))) + { + return TeaModel.ToObject<TResult>(this._client.ToRespModel(respMap)); + } + } + else + { + if (this._client.Verify(respMap, this._client.GetConfig("alipayPublicKey"))) + { +#if DEBUG + // var respModel = this._client.ToRespModel(respMap); + // var resultObject = TeaModel.ToObject<TResult>(respModel); + +#endif + return TeaModel.ToObject<TResult>(this._client.ToRespModel(respMap)); + } + } + throw new TeaException(new Dictionary<string, string> + { + {"message", "楠岀澶辫触锛岃妫�鏌ユ敮浠樺疂鍏挜璁剧疆鏄惁姝g‘銆�"}, + }); + } + catch (Exception e) + { + if (TeaCore.IsRetryable(e)) + { + _lastException = e; + continue; + } + throw e; + } + } + + throw new TeaUnretryableException(_lastRequest, _lastException); + } + + public async Task<TResult> PageRequest<TInput, TResult>(TInput input, string methodName, string returnUrl, string getMethod = "POST") + where TResult : class, new() + where TInput : class, new() + { + var systemParams = this.GetSystemParams(methodName); + Dictionary<string, object> bizParams = ClientUtil.Parse2Dic(input); + Dictionary<string, string> textParams = new Dictionary<string, string> + { + {"return_url", returnUrl }, + }; + string sign = this._client.Sign(systemParams, bizParams, textParams, this._client.GetConfig("merchantPrivateKey")); + Dictionary<string, string> response = new Dictionary<string, string> + { + {"body", this._client.GeneratePage(getMethod, systemParams, bizParams, textParams, sign) }, + }; + return TeaModel.ToObject<TResult>(response); + } + + public Dictionary<string, string> GetSystemParams(string methodName) + { + Dictionary<string, string> systemParams = new Dictionary<string, string> + { + {"method", methodName}, + {"app_id", this._client.GetConfig("appId")}, + {"timestamp", this._client.GetTimestamp()}, + {"format", "json"}, + {"version", "1.0"}, + {"alipay_sdk", this._client.GetSdkVersion()}, + {"charset", "UTF-8"}, + {"sign_type", this._client.GetConfig("signType")}, + {"app_cert_sn", this._client.GetMerchantCertSN()}, + {"alipay_root_cert_sn", this._client.GetAlipayRootCertSN()}, + }; + return systemParams; + } + + private Stream ToMultipartRequestBody(Dictionary<string, string> textParams, Dictionary<string, (string Name, byte[] Bytes)> fileParams, string boundary) + { + MemoryStream memoryStream = new MemoryStream(); + foreach (KeyValuePair<string, string> textParam in textParams) + { + if (!string.IsNullOrEmpty(textParam.Key) && !string.IsNullOrEmpty(textParam.Value)) + { + MultipartUtil.WriteToStream(memoryStream, MultipartUtil.GetEntryBoundary(boundary)); + MultipartUtil.WriteToStream(memoryStream, MultipartUtil.GetTextEntry(textParam.Key, textParam.Value)); + } + } + + foreach (KeyValuePair<string, (string Name, byte[] Bytes)> fileParam in fileParams) + { + if (!string.IsNullOrEmpty(fileParam.Key)) + { + MultipartUtil.WriteToStream(memoryStream, MultipartUtil.GetEntryBoundary(boundary)); + MultipartUtil.WriteToStream(memoryStream, GetFileEntry(fileParam.Key, fileParam.Value.Name)); + MultipartUtil.WriteToStream(memoryStream, fileParam.Value.Bytes); + } + } + + MultipartUtil.WriteToStream(memoryStream, MultipartUtil.GetEndBoundary(boundary)); + memoryStream.Seek(0L, SeekOrigin.Begin); + return memoryStream; + } + + private byte[] GetFileEntry(string fieldName, string fileName) + { + string s = "Content-Disposition:form-data;name=\"" + fieldName + "\";filename=\"" + fileName + "\"\r\nContent-Type:application/octet-stream\r\n\r\n"; + return AlipayConstants.DEFAULT_CHARSET.GetBytes(s); + } + + private Dictionary<string, string> Parse2StrDic<TInput>(TInput input) where TInput : class, new() + { + Dictionary<string, string> dictionary = new Dictionary<string, string>(); + Type typeFromHandle = typeof(TInput); + PropertyInfo[] properties = typeFromHandle.GetProperties().Where(x => !x.CustomAttributes.Any(x => x.AttributeType == typeof(JsonIgnoreAttribute))).ToArray(); + PropertyInfo[] array = properties; + foreach (PropertyInfo propertyInfo in array) + { + JsonPropertyAttribute attribute = propertyInfo.GetCustomAttribute<JsonPropertyAttribute>(); + string key = string.Empty; + bool flag = false; + if (attribute != null) + { + if (attribute.PropertyName != null) + { + key = attribute.PropertyName; + } + + if (attribute.NullValueHandling == NullValueHandling.Ignore) + { + flag = true; + } + else if (attribute.NullValueHandling == NullValueHandling.Include) + { + flag = false; + } + } + else + { + key = propertyInfo.Name; + } + + object obj = propertyInfo.GetValue(input, null); + if (!flag || obj != null) + { + if (obj is IDictionary && obj != null) + { + obj = JsonConvert.SerializeObject(obj); + } + + dictionary.Add(key, Convert.ToString(obj)); + } + } + + return dictionary; + } + + private Dictionary<string, object> Parse2Dic(object input) + { + if (input == null) + { + return new Dictionary<string, object>(); + } + + // 灏嗗璞″簭鍒楀寲涓� JSON 瀛楃涓� + string jsonString = JsonConvert.SerializeObject(input); + return ConvertJsonStringToDictionary(jsonString); + } + + private Dictionary<string, object> ConvertJsonStringToDictionary(string jsonString) + { + JToken token = JToken.Parse(jsonString); + return ParseToken(token) as Dictionary<string, object>; + } + + private object ParseToken(JToken token) + { + switch (token.Type) + { + case JTokenType.Object: + return ParseObject(token as JObject); + case JTokenType.Array: + return ParseArray(token as JArray); + default: + return ((JValue)token).Value; + } + } + + private Dictionary<string, object> ParseObject(JObject jObject) + { + var dict = new Dictionary<string, object>(); + foreach (var property in jObject.Properties()) + { + dict[property.Name] = ParseToken(property.Value); + } + return dict; + } + + private Dictionary<string, object> ParseArray(JArray jArray) + { + var dict = new Dictionary<string, object>(); + for (int i = 0; i < jArray.Count; i++) + { + dict[i.ToString()] = ParseToken(jArray[i]); + } + return dict; + } + } +} diff --git a/LifePayment/LifePayment.Domain/Ali/AlipayApiConstant.cs b/LifePayment/LifePayment.Domain/Ali/AlipayApiConstant.cs new file mode 100644 index 0000000..407c6a0 --- /dev/null +++ b/LifePayment/LifePayment.Domain/Ali/AlipayApiConstant.cs @@ -0,0 +1,36 @@ +锘縰sing System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace LifePayment.Domain +{ + public class AlipayApiConstant + { + internal const string UserAgreementPageSign = "alipay.user.agreement.page.sign"; + internal const string UserAgreementQuery = "alipay.user.agreement.query"; + internal const string UserAgreementUnsign = "alipay.user.agreement.unsign"; + internal const string FundAccountBookCreate = "alipay.fund.accountbook.create"; + internal const string FundAccountBookQuery = "alipay.fund.accountbook.query"; + internal const string FundTransUniTransfer = "alipay.fund.trans.uni.transfer"; + internal const string FundTransCommonQuery = "alipay.fund.trans.common.query"; + internal const string FundTransOrderChanged = "alipay.fund.trans.order.changed"; + internal const string FundTransPagePay = "alipay.fund.trans.page.pay"; + + + //internal const string FundBatchUniTransfer = "alipay.fund.batch.uni.transfer"; + //internal const string FundBatchDetailQuery = "alipay.fund.batch.detail.query"; + //internal const string FundBatchOrderChanged = "alipay.fund.batch.order.changed"; + //internal const string FundAccountQuery = "alipay.fund.account.query"; + internal const string DataBillErceiptApply = "alipay.data.bill.ereceiptagent.apply"; + internal const string DataBillEreceiptQuery = "alipay.data.bill.accountbookereceipt.query"; + internal const string DataDataserviceBillDownloadUrlQuery = "alipay.data.dataservice.bill.downloadurl.query"; + } + + public class AlipayResultCode + { + public const string Success = "10000"; + public const string Fail = "40004"; + } +} diff --git a/LifePayment/LifePayment.Domain/Ali/AlipayInterfaceManager.cs b/LifePayment/LifePayment.Domain/Ali/AlipayInterfaceManager.cs new file mode 100644 index 0000000..0e1f2c1 --- /dev/null +++ b/LifePayment/LifePayment.Domain/Ali/AlipayInterfaceManager.cs @@ -0,0 +1,184 @@ +锘縰sing Alipay.EasySDK.Kernel; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; +using Newtonsoft.Json; +using System.Collections.Generic; +using System.IO; +using System.Threading.Tasks; +using ZeroD.Util; + +namespace LifePayment.Domain +{ + public class AlipayInterfaceManager : AlipayApiClient, IAlipayInterfaceManager + { + + private Config _config; + + public AlipayInterfaceManager(IOptionsMonitor<Config> optionsMonitor, ILogger<AlipayInterfaceManager> logger) : base(optionsMonitor, logger) + { + _config = optionsMonitor.CurrentValue; + } + + /// <summary> + /// 鏀粯瀹濈敤鎴峰崗璁绾︽帴鍙� + /// 鏀寔鐢ㄦ埛鍦ㄦ敮浠樺疂椤甸潰瀹屾垚鏀粯瀹濆崗璁殑绛剧害锛岀洰鍓嶆敮鎸佹敮浠樺疂閽卞寘H5椤甸潰绛剧害銆佹壂鐮佺绾︾瓑鏂瑰紡銆� + /// 姝ゆ帴鍙e苟闈炵洿鎺ヨ皟鐢ㄧ殑鎺ュ彛锛岄渶鎷兼帴璺宠浆閾炬帴鍞よ捣锛屽叿浣撴柟寮忚涓嬫枃鈥滄棤绾跨鍞よ捣绛剧害璇存槑鈥� + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + public async Task<UserAgreementPageSignResponse> UserAgreementPageSign(UserAgreementPageSignInput input) + { + return await base.PageRequest<UserAgreementPageSignInput, UserAgreementPageSignResponse>(input, AlipayApiConstant.UserAgreementPageSign, _config.NotifyUrl + "/api/AliPayNotify/NotifyOrderChanged ", "GET"); + } + + /// <summary> + /// 鏀粯瀹濈敤鎴峰崗璁煡璇㈡帴鍙� + /// 浜鸿祫鍗忚鎺堟潈绛剧害鏌ヨ + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + public async Task<UserAgreementQueryResponse> UserAgreementQuery(UserAgreementQueryInput input) + { + return await base.Request<UserAgreementQueryInput, UserAgreementQueryResponse>(input, AlipayApiConstant.UserAgreementQuery); + } + + /// <summary> + /// 鏀粯瀹濈敤鎴峰崗璁В绾︽帴鍙� + /// 浜鸿祫鍗忚瑙g害 + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + public async Task<AlipayBaseOutput> UserAgreementUnsign(UserAgreementUnsignInput input) + { + return await base.Request<UserAgreementUnsignInput, AlipayBaseOutput>(input, AlipayApiConstant.UserAgreementUnsign); + } + + /// <summary> + /// 璧勯噾璁拌处鏈紑閫� + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + public async Task<FundAccountbookCreateResponse> FundAccountbookCreate(FundAccountbookCreateInput input) + { + return await base.Request<FundAccountbookCreateInput, FundAccountbookCreateResponse>(input, AlipayApiConstant.FundAccountBookCreate); + } + + /// <summary> + /// 鏌ヨ璧勯噾璁拌处鏈殑鍙敤閲戦绛変俊鎭� + /// 鍩轰簬鐢ㄦ埛鎺堟潈鍗忚锛屽钩鍙板彲閫氳繃鍚庡彴鏈嶅姟鎺ュ彛锛屼负骞冲彴涓婄殑鐢ㄦ埛鎻愪緵璧勯噾璁拌处鏈浉鍏充俊鎭煡璇㈡湇鍔� + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + public async Task<FundAccountBookQueryResponse> FundAccountBookQuery(FundAccountBookQueryInput input) + { + return await base.Request<FundAccountBookQueryInput, FundAccountBookQueryResponse>(input, AlipayApiConstant.FundAccountBookQuery); + } + + + /// <summary> + /// 鍗曠瑪杞处鎺ュ彛鏄熀浜庢敮浠樺疂鐨勮祫閲戝鐞嗚兘鍔涳紝涓轰簡婊¤冻鏀粯瀹濆晢瀹剁殑杞处闇�姹傦紝閽堝鏈夐儴鍒嗗紑鍙戣兘鍔涚殑鍟嗗锛屾彁渚涢�氳繃API鎺ュ彛瀹屾垚浼佷笟鑷韩鏀粯瀹濊处鎴峰埌鏀粯瀹濊处鎴枫�佷紒涓氳嚜韬敮浠樺疂璐︽埛鍒伴摱琛屽崱鐨勮浆璐﹀姛鑳姐�� + /// 閫傜敤浜庯細C2C鐜伴噾绾㈠寘鐨勭孩鍖呴鍙栥�丅2C鐜伴噾绾㈠寘鐨勭孩鍖呭彂鏀俱�丅2C鍗曠瑪杞处鍒版敮浠樺疂璐︽埛銆丅2C鍗曠瑪杞处鍒伴摱琛屽崱绛夈�� + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + public async Task<FundTransUniTransferResponse> FundTransUniTransfer(FundTransUniTransferInput input) + { + return await base.Request<FundTransUniTransferInput, FundTransUniTransferResponse>(input, AlipayApiConstant.FundTransUniTransfer); + } + + /// <summary> + /// 杞处涓氬姟鍗曟嵁鏌ヨ鎺ュ彛 + /// 鍟嗘埛鍙�氳繃璇ユ帴鍙f煡璇㈣浆璐︿笟鍔″崟鎹殑鐘舵�侊紝涓昏搴旂敤浜庣粺涓�杞处鎺ュ彛(alipay.fund.trans.uni.transfer)銆佹棤绾胯浆璐︽帴鍙�(alipay.fund.trans.app.pay)銆佸崟绗旇浆璐﹀埌鏀粯瀹濊处鎴锋帴鍙o紙alipay.fund.trans.toaccount.transfer锛� + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + public async Task<FundTransCommonQueryResponse> FundTransCommonoQuery(FundTransCommonQueryInput input) + { + return await base.Request<FundTransCommonQueryInput, FundTransCommonQueryResponse>(input, AlipayApiConstant.FundTransCommonQuery); + } + + /// <summary> + /// 璧勯噾璋冩嫧鍒扮敤鎴峰悕涓嬬殑鍙戣柂涓撻」鐨勯〉闈粯娆炬帴鍙� + /// 鍩轰簬鐢ㄦ埛鎺堟潈鍗忚锛屽钩鍙伴�氳繃椤甸潰鎺ュ彛褰㈠紡鍞よ捣鏀粯瀹濆閮ㄦ敹閾跺彴銆傚緟鐢ㄦ埛鏍歌韩纭鍚庯紝鏀粯瀹濇湇鍔$渚濇嵁骞冲彴鎸囦护锛屽皢鐢ㄦ埛鏀粯瀹濈殑鍙敤璧勯噾鍒掓嫧鍒扮敤鎴峰悕涓嬬殑鍙戣柂涓撻」涓嶅彲鐢ㄨ祫閲戜腑锛屽苟灏嗗鐞嗙粨鏋滀互寮傛娑堟伅鏂瑰紡閫氱煡鍒板钩鍙� + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + public async Task<AlipayFundTransPagePayResponse> FundTransPagePay(FundTransPagePayInput input) + { + return await base.PageRequest<FundTransPagePayInput, AlipayFundTransPagePayResponse>(input, AlipayApiConstant.FundTransPagePay, _config.NotifyUrl + "/AliPayNotify/NotifyOrderChanged"); + } + + ///// <summary> + ///// 鍩轰簬浠樻鏂圭殑濮旀墭鎺堟潈锛岀敤浜庢壒閲忓悜鎸囧畾鏀粯瀹濊处鎴�/閾惰鍗¤浆璐� + ///// 骞冲彴鍩轰簬浠樻鏂圭殑濮旀墭鎺堟潈锛屽皢鐢ㄦ埛鐨勪笓娆捐祫閲戞壒閲忚浆璐﹀埌鎸囧畾鐨勬敮浠樺疂璐︽埛 + ///// </summary> + ///// <param name="input"></param> + ///// <returns></returns> + //public Task<FundBatchUniTransferResponse> FundBatchUniTransfer(FundBatchUniTransferInput input) + //{ + // return base.Request<FundBatchUniTransferInput, FundBatchUniTransferResponse>(input, AlipayApiConstant.FundBatchUniTransfer); + //} + + + ///// <summary> + ///// 鍩轰簬浠樻鏂圭殑濮旀墭鎺堟潈锛� + ///// 鍦烘櫙涓�锛氬綋鍟嗘埛鏀跺埌鎵规寮傛閫氱煡鐨勫悗锛屽彲閫氳繃璇ユ帴鍙f煡璇㈡壒娆′笅鐨勬槑缁嗕俊鎭紱 + /////鍦烘櫙浜岋細鍟嗘埛鏈敹鍒版壒娆″紓姝ラ�氱煡鏃讹紝鍟嗘埛閫氳繃姝ゆ帴鍙e彲浠ヤ富鍔ㄦ煡璇㈡壒娆″拰鎵规涓嬫槑缁嗗崟鎹殑鐘舵�� + ///// </summary> + ///// <param name="input"></param> + ///// <returns></returns> + //public Task<FundBatchDetailQueryResponse> FundBatchDetailQuery(FundBatchDetailQueryInput input) + //{ + // return base.Request<FundBatchDetailQueryInput, FundBatchDetailQueryResponse>(input, AlipayApiConstant.FundBatchDetailQuery); + //} + + + ///// <summary> + ///// 鐢ㄤ簬鏌ヨ鏀粯瀹濊处鎴蜂綑棰� + ///// </summary> + ///// <param name="input"></param> + ///// <returns></returns> + //public Task<FundAccountQueryResponse> FundAccountQuery(FundAccountQueryInput input) + //{ + // return base.Request<FundAccountQueryInput, FundAccountQueryResponse>(input, AlipayApiConstant.FundAccountQuery); + //} + + /// <summary> + /// 鐢宠鐢靛瓙鍥炲崟 + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + public async Task<DataBillErceiptApplyResponse> DataBillErceiptApply(DataBillErceiptApplyInput input) + { + return await base.Request<DataBillErceiptApplyInput, DataBillErceiptApplyResponse>(input, AlipayApiConstant.DataBillErceiptApply); + } + + /// <summary> + /// 鏌ヨ鐢靛瓙鍥炲崟鐘舵�� + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + public async Task<DataBillEreceiptQueryResponse> DataBillEreceiptQuery(DataBillEreceiptQueryInput input) + { + return await base.Request<DataBillEreceiptQueryInput, DataBillEreceiptQueryResponse>(input, AlipayApiConstant.DataBillEreceiptQuery); + } + + /// <summary> + /// 璐﹀崟涓嬭浇 + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + public async Task<DataDataserviceBillDownloadUrlQueryResponse> DataDataserviceBillDownloadUrlQuery(DataDataserviceBillDownloadUrlQueryInput input) + { + return await base.Request<DataDataserviceBillDownloadUrlQueryInput, DataDataserviceBillDownloadUrlQueryResponse>(input, AlipayApiConstant.DataDataserviceBillDownloadUrlQuery); + } + + private static string GetPrivateKey(string appId) + { + IDictionary<string, string> json = JsonConvert.DeserializeObject<IDictionary<string, string>>( + File.ReadAllText(DirFileHelper.GetSolutionBasePath() + "/privateKey.json")); + return json[appId]; + } + } + +} diff --git a/LifePayment/LifePayment.Domain/Ali/AlipayManager.cs b/LifePayment/LifePayment.Domain/Ali/AlipayManager.cs new file mode 100644 index 0000000..93a3a63 --- /dev/null +++ b/LifePayment/LifePayment.Domain/Ali/AlipayManager.cs @@ -0,0 +1,138 @@ +锘縰sing LifePayment.Domain.Models; +using LifePayment.Domain.Shared; +using Microsoft.Extensions.Logging; +using NPOI.SS.Formula.Functions; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Text.Json; +using System.Threading.Tasks; +using Volo.Abp; +using Volo.Abp.Domain.Repositories; +using static LifePayment.Domain.Shared.LifePaymentConstant; + +namespace LifePayment.Domain +{ + public class AlipayManager : IAlipayManager + { + private readonly ILogger<AlipayManager> _logger; + private readonly IAlipayInterfaceManager _alipayInterfaceManager; + + public AlipayManager(ILogger<AlipayManager> logger, IAlipayInterfaceManager alipayInterfaceManager) + { + _logger = logger; + _alipayInterfaceManager = alipayInterfaceManager; + } + + public async Task<WalletSingleApplicationSuspensionPaymentOutput> AlipayTransUniTransferToCard(WalletSingleApplicationSuspensionPaymentInput input, bool isToCard) + { + var result = new WalletSingleApplicationSuspensionPaymentOutput() { Stt = LifePaymentConstant.AlipayOrderStatus.鏀粯澶辫触 }; + //var walletMainEntity = _walletMainRepository.Where(r => r.Id == input.WalletMainId).FirstOrDefault(); + //CheckExtensions.IfTrueThrowUserFriendlyException(walletMainEntity == null, + // "鏌ヨ鏀粯瀹濊璐︽湰鍑洪敊"); + //FundAccountBookQueryInput inputQuery = new FundAccountBookQueryInput + //{ + // AccountBookId = input.OutAcctNo, + // SceneCode = AlipayConstant.SceneCode, + // ExtInfo = "{\"agreement_no\":\"" + walletMainEntity.AlipayAgreementNo + "\"}" + + //}; + //var queryReusult = await _alipayInterfaceManager.FundAccountBookQuery(inputQuery); + //CheckExtensions.IfTrueThrowUserFriendlyException(queryReusult == null, + // "鏌ヨ鏀粯瀹濊璐︽湰鍑洪敊"); + //if (queryReusult != null) + //{ + + // CheckExtensions.IfTrueThrowUserFriendlyException(Convert.ToDecimal(queryReusult.AvaliableAmount) < input.TranAmount, + // "璁拌处鏈綑棰濅笉瓒�"); + //} + + //try + //{ + // FundTransUniTransferInput inputNew = new FundTransUniTransferInput + // { + // TransAmount = input.TranAmount.ToString(), + // ProductCode = "SINGLE_TRANSFER_NO_PWD", + // BizScene = "ENTRUST_TRANSFER", + + // OrderTitle = input.UseEx, + // Remark = input.UseEx, + // PayerInfo = new Participant + // { + // IdentityType = "ACCOUNT_BOOK_ID", + // Identity = input.OutAcctNo, + // ExtInfo = "{\"agreement_no\":\"" + walletMainEntity.AlipayAgreementNo + "\"}" + // }, + // BusinessParams = "{\"withdraw_timeliness\":\"" + "T0" + "\"}" + + // }; + // if (isToCard) + // { + // inputNew.OutBizNo = input.CnsmrSeqNo; + // inputNew.PayeeInfo = new Participant + // { + // IdentityType = "BANKCARD_ACCOUNT", + // Identity = input.InAcctNo, + // Name = input.InAcctName, + // BankCardExtInfo = new BankcardExtInfo + // { + // AccountType = "2", + // BankCode = input.InAcctBankNode, + // InstName = input.InAcctBankName, + // }, + + // }; + // } + // else + // { + // inputNew.OutBizNo = input.CnsmrSeqNo; + // inputNew.PayeeInfo = new Participant + // { + // IdentityType = "ALIPAY_LOGON_ID", + // Identity = input.InAcctNo, + // Name = input.InAcctName, + // }; + // } + // var output = await _alipayInterfaceManager.FundTransUniTransfer(inputNew); + // if (output != null && output.Code == AlipayResultCode.Success) + // { + + // result = new WalletSingleApplicationSuspensionPaymentOutput + // { + // FrontLogNo = output.OrderId, + // InAcctName = input.InAcctName, + // InAcctNo = input.InAcctNo, + // TranAmount = input.TranAmount.ToString(), + // OutAcctNo = input.OutAcctNo, + // AlipayStatus = output.Stauts, + // ThirdVoucher = output.OutBizNo, + // CstInnerFlowNo = output.PayFundOrderId, + // InAcctBankName = input.InAcctBankName, + // OutAcctName = input.OutAcctName, + // HostFlowNo = output.PayFundOrderId, + // Stt = output.Stauts + // }; + // } + // else + // { + // result = new WalletSingleApplicationSuspensionPaymentOutput + // { + // AlipayStatus = LifePaymentConstant.AlipayOrderStatus.鏀粯澶辫触 + // }; + // } + //} + //catch (Exception ex) + //{ + // _logger.LogError(ex, "鍙戣捣鎵f寮傚父"); + // result = new WalletSingleApplicationSuspensionPaymentOutput + // { + // AlipayStatus = LifePaymentConstant.AlipayOrderStatus.鏀粯澶辫触 + // }; + //} + + return result; + } + + } +} diff --git a/LifePayment/LifePayment.Domain/Ali/IAliPayApi.cs b/LifePayment/LifePayment.Domain/Ali/IAliPayApi.cs new file mode 100644 index 0000000..13d9afd --- /dev/null +++ b/LifePayment/LifePayment.Domain/Ali/IAliPayApi.cs @@ -0,0 +1,15 @@ +锘縰sing Alipay.EasySDK.Payment.Common.Models; +using Alipay.EasySDK.Payment.FaceToFace.Models; +using LifePayment.Domain.Shared; +using System.Threading.Tasks; +using Volo.Abp.DependencyInjection; + +namespace LifePayment.Domain +{ + public interface IAliPayApi : ITransientDependency + { + Task<AlipayTradePrecreateResponse> GetAliPayQRCode(GetPayQrCodeInput input); + + AlipayTradeQueryResponse OrderInQuiry(OrderInQuiryInput input); + } +} \ No newline at end of file diff --git a/LifePayment/LifePayment.Domain/Ali/IAlipayInterfaceManager.cs b/LifePayment/LifePayment.Domain/Ali/IAlipayInterfaceManager.cs new file mode 100644 index 0000000..3b0a4e8 --- /dev/null +++ b/LifePayment/LifePayment.Domain/Ali/IAlipayInterfaceManager.cs @@ -0,0 +1,98 @@ +锘縰sing System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace LifePayment.Domain +{ + public interface IAlipayInterfaceManager + { + /// <summary> + /// 鏀粯瀹濈敤鎴峰崗璁绾︽帴鍙� + /// 鏀寔鐢ㄦ埛鍦ㄦ敮浠樺疂椤甸潰瀹屾垚鏀粯瀹濆崗璁殑绛剧害锛岀洰鍓嶆敮鎸佹敮浠樺疂閽卞寘H5椤甸潰绛剧害銆佹壂鐮佺绾︾瓑鏂瑰紡銆� + /// 姝ゆ帴鍙e苟闈炵洿鎺ヨ皟鐢ㄧ殑鎺ュ彛锛岄渶鎷兼帴璺宠浆閾炬帴鍞よ捣锛屽叿浣撴柟寮忚涓嬫枃鈥滄棤绾跨鍞よ捣绛剧害璇存槑鈥� + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + Task<UserAgreementPageSignResponse> UserAgreementPageSign(UserAgreementPageSignInput input); + + /// <summary> + /// 鏀粯瀹濈敤鎴峰崗璁煡璇㈡帴鍙� + /// 浜鸿祫鍗忚鎺堟潈绛剧害鏌ヨ + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + Task<UserAgreementQueryResponse> UserAgreementQuery(UserAgreementQueryInput input); + + /// <summary> + /// 鏀粯瀹濈敤鎴峰崗璁В绾︽帴鍙� + /// 浜鸿祫鍗忚瑙g害 + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + Task<AlipayBaseOutput> UserAgreementUnsign(UserAgreementUnsignInput input); + + /// <summary> + /// 璧勯噾璁拌处鏈紑閫� + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + Task<FundAccountbookCreateResponse> FundAccountbookCreate(FundAccountbookCreateInput input); + + /// <summary> + /// 鏌ヨ璧勯噾璁拌处鏈殑鍙敤閲戦绛変俊鎭� + /// 鍩轰簬鐢ㄦ埛鎺堟潈鍗忚锛屽钩鍙板彲閫氳繃鍚庡彴鏈嶅姟鎺ュ彛锛屼负骞冲彴涓婄殑鐢ㄦ埛鎻愪緵璧勯噾璁拌处鏈浉鍏充俊鎭煡璇㈡湇鍔� + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + Task<FundAccountBookQueryResponse> FundAccountBookQuery(FundAccountBookQueryInput input); + + + /// <summary> + /// 鍗曠瑪杞处鎺ュ彛鏄熀浜庢敮浠樺疂鐨勮祫閲戝鐞嗚兘鍔涳紝涓轰簡婊¤冻鏀粯瀹濆晢瀹剁殑杞处闇�姹傦紝閽堝鏈夐儴鍒嗗紑鍙戣兘鍔涚殑鍟嗗锛屾彁渚涢�氳繃API鎺ュ彛瀹屾垚浼佷笟鑷韩鏀粯瀹濊处鎴峰埌鏀粯瀹濊处鎴枫�佷紒涓氳嚜韬敮浠樺疂璐︽埛鍒伴摱琛屽崱鐨勮浆璐﹀姛鑳姐�� + /// 閫傜敤浜庯細C2C鐜伴噾绾㈠寘鐨勭孩鍖呴鍙栥�丅2C鐜伴噾绾㈠寘鐨勭孩鍖呭彂鏀俱�丅2C鍗曠瑪杞处鍒版敮浠樺疂璐︽埛銆丅2C鍗曠瑪杞处鍒伴摱琛屽崱绛夈�� + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + Task<FundTransUniTransferResponse> FundTransUniTransfer(FundTransUniTransferInput input); + + /// <summary> + /// 杞处涓氬姟鍗曟嵁鏌ヨ鎺ュ彛 + /// 鍟嗘埛鍙�氳繃璇ユ帴鍙f煡璇㈣浆璐︿笟鍔″崟鎹殑鐘舵�侊紝涓昏搴旂敤浜庣粺涓�杞处鎺ュ彛(alipay.fund.trans.uni.transfer)銆佹棤绾胯浆璐︽帴鍙�(alipay.fund.trans.app.pay)銆佸崟绗旇浆璐﹀埌鏀粯瀹濊处鎴锋帴鍙o紙alipay.fund.trans.toaccount.transfer锛� + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + Task<FundTransCommonQueryResponse> FundTransCommonoQuery(FundTransCommonQueryInput input); + + /// <summary> + /// 璧勯噾璋冩嫧鍒扮敤鎴峰悕涓嬬殑鍙戣柂涓撻」鐨勯〉闈粯娆炬帴鍙� + /// 鍩轰簬鐢ㄦ埛鎺堟潈鍗忚锛屽钩鍙伴�氳繃椤甸潰鎺ュ彛褰㈠紡鍞よ捣鏀粯瀹濆閮ㄦ敹閾跺彴銆傚緟鐢ㄦ埛鏍歌韩纭鍚庯紝鏀粯瀹濇湇鍔$渚濇嵁骞冲彴鎸囦护锛屽皢鐢ㄦ埛鏀粯瀹濈殑鍙敤璧勯噾鍒掓嫧鍒扮敤鎴峰悕涓嬬殑鍙戣柂涓撻」涓嶅彲鐢ㄨ祫閲戜腑锛屽苟灏嗗鐞嗙粨鏋滀互寮傛娑堟伅鏂瑰紡閫氱煡鍒板钩鍙� + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + Task<AlipayFundTransPagePayResponse> FundTransPagePay(FundTransPagePayInput input); + + + /// <summary> + /// 鐢宠鐢靛瓙鍥炲崟 + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + Task<DataBillErceiptApplyResponse> DataBillErceiptApply(DataBillErceiptApplyInput input); + + /// <summary> + /// 鏌ヨ鐢靛瓙鍥炲崟鐘舵�� + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + Task<DataBillEreceiptQueryResponse> DataBillEreceiptQuery(DataBillEreceiptQueryInput input); + + /// <summary> + /// 璐﹀崟涓嬭浇 + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + Task<DataDataserviceBillDownloadUrlQueryResponse> DataDataserviceBillDownloadUrlQuery(DataDataserviceBillDownloadUrlQueryInput input); + } +} diff --git a/LifePayment/LifePayment.Domain/Ali/IAlipayManager.cs b/LifePayment/LifePayment.Domain/Ali/IAlipayManager.cs new file mode 100644 index 0000000..02f58b1 --- /dev/null +++ b/LifePayment/LifePayment.Domain/Ali/IAlipayManager.cs @@ -0,0 +1,15 @@ +锘縰sing LifePayment.Domain.Shared; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Volo.Abp.Domain.Services; + +namespace LifePayment.Domain +{ + public interface IAlipayManager : IDomainService + { + Task<WalletSingleApplicationSuspensionPaymentOutput> AlipayTransUniTransferToCard(WalletSingleApplicationSuspensionPaymentInput input, bool isToCard); + } +} diff --git a/LifePayment/LifePayment.Domain/Common/CommonManager.cs b/LifePayment/LifePayment.Domain/Common/CommonManager.cs new file mode 100644 index 0000000..794b0f5 --- /dev/null +++ b/LifePayment/LifePayment.Domain/Common/CommonManager.cs @@ -0,0 +1,99 @@ +锘縰sing LifePayment.Domain.Models; +using LifePayment.Domain.Shared; +using Microsoft.Extensions.Configuration; +using System; +using System.Net; +using System.Net.Http; +using System.Net.Http.Headers; +using System.Text; +using System.Text.Json; +using System.Threading.Tasks; +using Volo.Abp; +using Volo.Abp.Domain.Repositories; +using ZeroD.Util; +using System.Text.Json.Serialization; +using System.Text.Json; +using Aliyun.OSS.Util; +using Aliyun.OSS; +using Nest; +using System.IO; + +namespace LifePayment.Domain +{ + public class CommonManager : ICommonManager + { + private readonly IConfiguration _configuration; + private readonly IHttpClientFactory _httpClientFactory; + + public CommonManager( + IConfiguration configuration, + IHttpClientFactory httpClientFactory) + { + _configuration = configuration; + _httpClientFactory = httpClientFactory; + } + + public string GetOssUrl(string path, string fileName, byte[] bytes, string ext) + { + var ossHelper = new OssHelper(_configuration); + return ossHelper.GetOssUrl($"{path}{fileName}.{ext}", bytes); + } + + public string GetOssUrl(string path, string fileName, string base64Str, string ext) + { + var ossHelper = new OssHelper(_configuration); + return ossHelper.GetOssUrl($"{path}{fileName}.{ext}", Convert.FromBase64String(base64Str.Replace("data:image/png;base64,", string.Empty))); + } + + public async Task<TResult> PostAsync<TResult>(string url, dynamic input, int? timeout = null) + { + TimeSpan defaultTimeout = TimeSpan.FromSeconds(90); + var cookieContainer = new CookieContainer(); + using (var handler = new HttpClientHandler { CookieContainer = cookieContainer }) + { + using (var apiClient = new HttpClient(handler)) + { + apiClient.Timeout = timeout.HasValue ? TimeSpan.FromMilliseconds(timeout.Value) : defaultTimeout; + apiClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); + using (var requestContent = new StringContent(JsonString.Object2Json(input), Encoding.UTF8, "application/json")) + { + using (var response = await apiClient.PostAsync(url, requestContent)) + { + if (!response.IsSuccessStatusCode) + { + return default; + } + + if (typeof(TResult) == typeof(byte[])) + { + using (var res = await response.Content.ReadAsStreamAsync()) + { + int counts = (int)res.Length; + int offset = 0; + byte[] returnByte = new byte[counts]; + while (counts > 0) + { + int n = res.Read(returnByte, offset, counts); + if (n == 0) + { + break; + } + + counts -= n; + offset += n; + } + + return (TResult)Convert.ChangeType(returnByte, typeof(TResult)); + } + } + + var ajaxResponse = JsonString.JsonString2Object<TResult>(await response.Content.ReadAsStringAsync()); + return ajaxResponse; + } + } + } + } + } + + } +} \ No newline at end of file diff --git a/LifePayment/LifePayment.Domain/Common/ICommonManager.cs b/LifePayment/LifePayment.Domain/Common/ICommonManager.cs new file mode 100644 index 0000000..bba10c6 --- /dev/null +++ b/LifePayment/LifePayment.Domain/Common/ICommonManager.cs @@ -0,0 +1,17 @@ +锘縰sing LifePayment.Domain.Shared; +using System; +using System.Threading.Tasks; +using Volo.Abp.Domain.Services; + +namespace LifePayment.Domain +{ + public interface ICommonManager : IDomainService + { + string GetOssUrl(string path, string fileName, byte[] bytes, string ext); + + string GetOssUrl(string path, string fileName, string base64Str, string ext); + + Task<TResult> PostAsync<TResult>(string url, dynamic input, int? timeout = null); + + } +} \ No newline at end of file diff --git a/LifePayment/LifePayment.Domain/LifePay/LifePayOrder.cs b/LifePayment/LifePayment.Domain/LifePay/LifePayOrder.cs new file mode 100644 index 0000000..592a574 --- /dev/null +++ b/LifePayment/LifePayment.Domain/LifePay/LifePayOrder.cs @@ -0,0 +1,102 @@ +锘縰sing LifePayment.Domain.Shared; +using Org.BouncyCastle.Bcpg.OpenPgp; +using System; +using Volo.Abp; +using Volo.Abp.Domain.Entities.Auditing; + +namespace LifePayment.Domain.Models +{ + public partial class LifePayOrder : FullAuditedAggregateRoot<Guid>, IDataUserFilter + { + public LifePayOrder() + { + } + + public Guid? UserId { get; set; } + + /// <summary> + /// 鐢ㄦ埛鎵嬫満鍙� + /// </summary> + public string PhoneNumber { get; set; } + + /// <summary> + /// 鐢熸椿缂磋垂鏀粯绫诲瀷 + /// </summary> + public LifePayTypeEnum? LifePayType { get; set; } + + /// <summary> + /// 璁㈠崟绫诲瀷 + /// </summary> + public LifePayOrderTypeEnum LifePayOrderType { get; set; } + + /// <summary> + /// 璁㈠崟鍙� + /// </summary> + public string OrderNo { get; set; } + + /// <summary> + /// 鍏呭�奸噾棰� + /// </summary> + public decimal RechargeAmount { get; set; } + + /// <summary> + /// 浼樻儬閲戦 + /// </summary> + public decimal DiscountAmount { get; set; } + + /// <summary> + /// 瀹炰粯閲戦 + /// </summary> + public decimal PayAmount { get; set; } + + /// <summary> + /// 鏀粯鏃堕棿 + /// </summary> + public DateTime? PayTime { get; set; } + + /// <summary> + /// 鏀粯鐘舵�� + /// </summary> + public LifePayStatusEnum PayStatus { get; set; } + + /// <summary> + /// 澶栭儴璁㈠崟鍙� + /// </summary> + public string OutOrderNo { get; set; } + + /// <summary> + /// 璁㈠崟鐘舵�� + /// </summary> + public LifePayOrderStatusEnum LifePayOrderStatus { get; set; } + + /// <summary> + /// 瀹屾垚鏃堕棿 + /// </summary> + public DateTime? FinishTime { get; set; } + + /// <summary> + /// 閫�娆惧嚟璇� + /// </summary> + public string RefundCredentialsImgUrl { get; set; } + + /// <summary> + /// 璁㈠崟鍙傛暟璇︽儏 + /// </summary> + public string OrderParamDetailJsonStr { get; set; } + + /// <summary> + /// 璇锋眰鍙� + /// </summary> + public string OutRequestNo { get; set; } + + /// <summary> + /// ACOOLY璁㈠崟鍙� + /// </summary> + public string ACOOLYOrderNo { get; set; } + + /// <summary> + /// 閫�娆炬椂闂� + /// </summary> + public DateTime? RefundTime { get; set; } + } +} \ No newline at end of file diff --git a/LifePayment/LifePayment.Domain/LifePay/LifePayRate.cs b/LifePayment/LifePayment.Domain/LifePay/LifePayRate.cs new file mode 100644 index 0000000..c207612 --- /dev/null +++ b/LifePayment/LifePayment.Domain/LifePay/LifePayRate.cs @@ -0,0 +1,17 @@ +锘縰sing LifePayment.Domain.Shared; +using System; +using Volo.Abp; +using Volo.Abp.Domain.Entities.Auditing; + +namespace LifePayment.Domain; + +public partial class LifePayRate : FullAuditedEntity<Guid>, IDataUserFilter +{ + public LifePayRate() + { + } + + public LifePayRateTypeEnum RateType { get; set; } + + public decimal Rate { get; set; } +} \ No newline at end of file diff --git a/LifePayment/LifePayment.Domain/LifePay/LifePayUser.cs b/LifePayment/LifePayment.Domain/LifePay/LifePayUser.cs new file mode 100644 index 0000000..bad9e84 --- /dev/null +++ b/LifePayment/LifePayment.Domain/LifePay/LifePayUser.cs @@ -0,0 +1,27 @@ +锘縰sing System; +using Volo.Abp; +using Volo.Abp.Domain.Entities.Auditing; + +namespace LifePayment.Domain.Models +{ + public partial class LifePayUser : FullAuditedEntity<Guid>, IDataUserFilter + { + public LifePayUser() + { + } + + /// <summary> + /// 鐢ㄦ埛鎵嬫満鍙� + /// </summary> + public string PhoneNumber { get; set; } + + /// <summary> + /// 灏忕▼搴廜penId + /// </summary> + public string OpenId { get; set; } + + public string UnionId { get; set; } + + public DateTime? LastLoginTime { get; set; } + } +} \ No newline at end of file diff --git a/LifePayment/LifePayment.Domain/WeChat/IWxManager.cs b/LifePayment/LifePayment.Domain/WeChat/IWxManager.cs new file mode 100644 index 0000000..3d273b8 --- /dev/null +++ b/LifePayment/LifePayment.Domain/WeChat/IWxManager.cs @@ -0,0 +1,25 @@ +锘縰sing LifePayment.Domain.Shared; +using System.Threading.Tasks; +using Volo.Abp.Domain.Services; + +namespace LifePayment.Domain +{ + public interface IWxManager : IDomainService + { + Task<string> GetWxMiniAccessToken(); + + Task<string> CreateQrCodeUrl(string name, CreateQrCodeInput input); + + Task<byte[]> CreateQrCode(CreateQrCodeInput input); + + Task<WxMiniAppIndentity> GetWxIndentity(string code, WxMiniAppEnum wxMiniApp); + + Task<WxMiniAppIndentity> GetWxOauth2AccessToken(string code); + + string GetPhoneNumber(string encryptedDataStr, string iv, string sessionKey); + + WxMiniAppUserInfo GetUserInfo(string encryptedDataStr, string iv, string sessionKey); + + Task<GetCgiWritingResponse> GetWxPublishWriting(); + } +} \ No newline at end of file diff --git a/LifePayment/LifePayment.Domain/WeChat/IWxPayApi.cs b/LifePayment/LifePayment.Domain/WeChat/IWxPayApi.cs new file mode 100644 index 0000000..aecaf8c --- /dev/null +++ b/LifePayment/LifePayment.Domain/WeChat/IWxPayApi.cs @@ -0,0 +1,26 @@ +锘縰sing LifePayment.Domain.Shared; +using System.Security.Cryptography; +using System; +using System.Threading.Tasks; +using Volo.Abp.DependencyInjection; + +namespace LifePayment.Domain +{ + public interface IWxPayApi : ITransientDependency + { + Task<CertificatesReponse> GetCertificates(); + + string AesGcmDecrypt(string associatedData, string nonce, string ciphertext); + + Task<PayTransactionsNativeReponse> PayTransactionsNative(PayTransactionsNativeInput input); + + Task<PayTransactionsReponse> PayTransactions(PayTransactionsInput input); + + Task<PayTransactionsH5Reponse> PayTransactionsH5(PayTransactionsNativeH5 input); + + Task<ModelPayPrePayId> PayTransactionsJsAPI(ModelMiniPayRequest input); + + string GeneratePaySignByKey(string message); + + } +} \ No newline at end of file diff --git a/LifePayment/LifePayment.Domain/WeChat/WxClient.cs b/LifePayment/LifePayment.Domain/WeChat/WxClient.cs new file mode 100644 index 0000000..63ef888 --- /dev/null +++ b/LifePayment/LifePayment.Domain/WeChat/WxClient.cs @@ -0,0 +1,155 @@ +锘縠xtern alias BouncyCastleA; +using LifePayment.Domain.Shared; +using Microsoft.Extensions.Options; +using Newtonsoft.Json; +using System; +using System.IO; +using System.Linq; +using System.Net.Http; +using System.Security.Cryptography; +using System.Text; +using System.Threading.Tasks; +using Volo.Abp.DependencyInjection; +using AeadParametersA = BouncyCastleA.Org.BouncyCastle.Crypto.Parameters.AeadParameters; +using AesEngineA = BouncyCastleA.Org.BouncyCastle.Crypto.Engines.AesEngine; +using GcmBlockCipherA = BouncyCastleA.Org.BouncyCastle.Crypto.Modes.GcmBlockCipher; +using KeyParameterA = BouncyCastleA.Org.BouncyCastle.Crypto.Parameters.KeyParameter; + + +namespace LifePayment.Domain +{ + public abstract class WxClient + { + public IAbpLazyServiceProvider LazyServiceProvider { get; set; } + + protected WxPayOption Options => LazyServiceProvider.LazyGetRequiredService<IOptionsMonitor<WxPayOption>>().CurrentValue; + + protected IHttpClientFactory HttpClientFactory => LazyServiceProvider.LazyGetRequiredService<IHttpClientFactory>(); + + protected WxPayRsaHelper WxPayRsaHelper => LazyServiceProvider.LazyGetRequiredService<WxPayRsaHelper>(); + + public async Task<TResult> PostAsync<TInput, TResult>(TInput input, string function) where TInput : WxPayPostBaseModel + { + var client = HttpClientFactory.CreateClient(LifePaymentConstant.WxPayHttpClientName); + var body = JsonConvert.SerializeObject(input); + AddAuthHeader(client, BuildAuth(body, function)); + var data = new StringContent(body, Encoding.UTF8, "application/json"); + var responseMessage = await client.PostAsync($"{Options.Url}{function}", data); + + var str = await responseMessage.Content.ReadAsStringAsync(); + var result = JsonConvert.DeserializeObject<TResult>(str); + return result; + } + + public async Task<TResult> GetAsync<TInput, TResult>(TInput input, string function) + { + var client = HttpClientFactory.CreateClient(LifePaymentConstant.WxPayHttpClientName); + StringBuilder strBuilder = new StringBuilder(); + var type = typeof(TInput); + strBuilder.Append(function); + var props = type.GetProperties().ToList(); + props.Where(r => r.GetCustomAttributes(typeof(PathAttribute), true).Any()).ToList().ForEach(r => + { + var name = r.Name; + var propAttr = (JsonPropertyAttribute)r.GetCustomAttributes(typeof(JsonPropertyAttribute), true).FirstOrDefault(); + if (propAttr != null) + { + name = propAttr.PropertyName; + } + + var value = r.GetValue(input)?.ToString(); + if (!value.IsNullOrEmpty()) + { + strBuilder.Append($"/{name}/{value}"); + } + }); + int i = 0; + props.Where(r => r.GetCustomAttributes(typeof(QueryAttribute), true).Any()).ToList().ForEach(r => + { + if (i == 0) + { + strBuilder.Append("?"); + } + else + { + strBuilder.Append("&"); + } + + var value = r.GetValue(input)?.ToString(); + var name = r.Name; + var propAttr = (JsonPropertyAttribute)r.GetCustomAttributes(typeof(JsonPropertyAttribute), true).FirstOrDefault(); + if (propAttr != null) + { + name = propAttr.PropertyName; + } + + if (!value.IsNullOrEmpty()) + { + strBuilder.Append($"{name}={value}"); + } + + i = i + 1; + }); + AddAuthHeader(client, BuildAuth(string.Empty, strBuilder.ToString(), "GET")); + var responseMessage = await client.GetAsync(Options.Url + strBuilder.ToString()); + var str = await responseMessage.Content.ReadAsStringAsync(); + var result = JsonConvert.DeserializeObject<TResult>(str); + var requestBody = JsonConvert.SerializeObject(input); + return result; + } + + public async Task<TResult> Certificates<TResult>(string function) + { + var client = HttpClientFactory.CreateClient(LifePaymentConstant.WxPayHttpClientName); + StringBuilder strBuilder = new StringBuilder(); + strBuilder.Append(function); + AddAuthHeader(client, BuildAuth(string.Empty, strBuilder.ToString(), "GET")); + var responseMessage = await client.GetAsync(Options.Url + strBuilder.ToString()); + var str = await responseMessage.Content.ReadAsStringAsync(); + var result = JsonConvert.DeserializeObject<TResult>(str); + return result; + } + + public async Task<CertificatesReponse> GetCertificates() + { + return await Certificates<CertificatesReponse>(LifePaymentConstant.WxPayCertificates); + } + + public string AesGcmDecrypt(string associatedData, string nonce, string ciphertext) + { + GcmBlockCipherA gcmBlockCipher = new GcmBlockCipherA(new AesEngineA()); + AeadParametersA aeadParameters = new AeadParametersA(new KeyParameterA(Encoding.UTF8.GetBytes(Options.APIKey)), + 128, + Encoding.UTF8.GetBytes(nonce), + Encoding.UTF8.GetBytes(associatedData)); + gcmBlockCipher.Init(false, aeadParameters); + byte[] data = Convert.FromBase64String(ciphertext); + byte[] plaintext = new byte[gcmBlockCipher.GetOutputSize(data.Length)]; + int length = gcmBlockCipher.ProcessBytes(data, 0, data.Length, plaintext, 0); + gcmBlockCipher.DoFinal(plaintext, length); + return Encoding.UTF8.GetString(plaintext); + } + public string GeneratePaySignByKey(string message) + { + + return WxPayRsaHelper.Sign(message); + } + + protected void AddAuthHeader(HttpClient client, string authSign) + { + client.DefaultRequestHeaders.Add("Authorization", $"WECHATPAY2-SHA256-RSA2048 {authSign}"); + } + + private string BuildAuth(string body, string url, string method = "POST") + { + var timestamp = DateTimeOffset.Now.ToUnixTimeSeconds(); + string nonce = Path.GetRandomFileName(); + string message = $"{method}\n{url}\n{timestamp}\n{nonce}\n{body}\n"; + string signature = WxPayRsaHelper.Sign(message); + return $"mchid=\"{Options.Mchid}\",nonce_str=\"{nonce}\",timestamp=\"{timestamp}\",serial_no=\"{Options.SerialNo}\",signature=\"{signature}\""; + } + + + + } +} \ No newline at end of file diff --git a/LifePayment/LifePayment.Domain/WeChat/WxManager.cs b/LifePayment/LifePayment.Domain/WeChat/WxManager.cs new file mode 100644 index 0000000..e958095 --- /dev/null +++ b/LifePayment/LifePayment.Domain/WeChat/WxManager.cs @@ -0,0 +1,184 @@ +锘縰sing LifePayment.Domain.Shared; +using Microsoft.Extensions.Caching.Distributed; +using Microsoft.Extensions.Options; +using Newtonsoft.Json; +using System; +using System.IO; +using System.Net.Http; +using System.Security.Cryptography; +using System.Text; +using System.Threading.Tasks; +using Volo.Abp; +using Volo.Abp.Caching; +using ZeroD.Util; + +namespace LifePayment.Domain +{ + public class WxManager : IWxManager + { + private readonly WxMiniAppOption _wxOptions; + private readonly InformationOption _informationOption; + private readonly WxMatchMakingMiniAppOption _wxMatchMakingMiniAppOption; + private readonly ICommonManager _commonManager; + private readonly IHttpClientFactory _httpClientFactory; + private readonly IDistributedCache<string> _distributedCache; + + public WxManager( + ICommonManager commonManager, + IHttpClientFactory httpClientFactory, + IDistributedCache<string> distributedCache, + IOptionsMonitor<WxMiniAppOption> wxOptionsMonitor, + IOptionsMonitor<InformationOption> informationOptionMonitor, + IOptionsMonitor<WxMatchMakingMiniAppOption> wxMatchMakingMiniAppOptionMonitor) + { + _commonManager = commonManager; + _distributedCache = distributedCache; + _httpClientFactory = httpClientFactory; + _wxOptions = wxOptionsMonitor.CurrentValue; + _informationOption = informationOptionMonitor.CurrentValue; + _wxMatchMakingMiniAppOption = wxMatchMakingMiniAppOptionMonitor.CurrentValue; + } + + public async Task<string> GetWxMiniAccessToken() + { + var result = await _distributedCache.GetAsync(LifePaymentConstant.灏忕▼搴廡oken缂撳瓨key); + if (result != null) + { + return result; + } + + var client = _httpClientFactory.CreateClient(LifePaymentConstant.WeChatHttpClientName); + var url = $"{_wxOptions.Url}{string.Format(LifePaymentConstant.寰俊灏忕▼搴忚幏鍙朤oken, _wxOptions.AppId, _wxOptions.Secret)}"; + var responseMessage = await client.GetAsync(url); + var str = await responseMessage.Content.ReadAsStringAsync(); + var res = JsonConvert.DeserializeObject<WxMiniTokenInfo>(str); + if (res == null || res.AccessToken.IsNullOrEmpty() || res.ExpiresIn == default) + { + throw new UserFriendlyException("鑾峰彇灏忕▼搴弔oken澶辫触"); + } + + await _distributedCache.SetAsync(LifePaymentConstant.灏忕▼搴廡oken缂撳瓨key, res.AccessToken, new DistributedCacheEntryOptions + { + AbsoluteExpirationRelativeToNow = TimeSpan.FromSeconds(res.ExpiresIn - 360), + }); + return res.AccessToken; + } + + public async Task<string> GetWxCgiAccessToken() + { + var result = await _distributedCache.GetAsync(LifePaymentConstant.寰俊鍏紬鍙稵oken缂撳瓨key); + if (result != null) + { + return result; + } + + var client = _httpClientFactory.CreateClient(LifePaymentConstant.WeChatHttpClientName); + var url = $"{_informationOption.RequestUrl}{string.Format(LifePaymentConstant.寰俊灏忕▼搴忚幏鍙朤oken, _informationOption.AppId, _informationOption.AppSecret)}"; + var responseMessage = await client.GetAsync(url); + var str = await responseMessage.Content.ReadAsStringAsync(); + var res = JsonConvert.DeserializeObject<WxMiniTokenInfo>(str); + if (res == null || res.AccessToken.IsNullOrEmpty() || res.ExpiresIn == default) + { + throw new UserFriendlyException("鑾峰彇灏忕▼搴弔oken澶辫触"); + } + + await _distributedCache.SetAsync(LifePaymentConstant.寰俊鍏紬鍙稵oken缂撳瓨key, res.AccessToken, new DistributedCacheEntryOptions + { + AbsoluteExpirationRelativeToNow = TimeSpan.FromSeconds(res.ExpiresIn - 360), + }); + return res.AccessToken; + } + + public async Task<string> CreateQrCodeUrl(string name, CreateQrCodeInput input) + { + var res = await CreateQrCode(input); + var reslut = _commonManager.GetOssUrl(LifePaymentConstant.鎵爜鐧诲綍浜岀淮鐮佽矾寰�, name, res, "png"); + return reslut; + } + + public async Task<byte[]> CreateQrCode(CreateQrCodeInput input) + { + var token = await GetWxMiniAccessToken(); + string url = $"{_informationOption.RequestUrl}{string.Format(LifePaymentConstant.寰俊灏忕▼搴忓垱寤轰簩缁寸爜, token)}"; ; + return await _commonManager.PostAsync<byte[]>(url, new + { + page = input.Page, + scene = input.Scene, + env_version = input.EnvVersion, + width = input.Width, + check_path = input.CheckPath, + }); + } + + public async Task<WxMiniAppIndentity> GetWxIndentity(string code, WxMiniAppEnum wxMiniApp) + { + var appInfo = GetAppInfoByEnum(wxMiniApp); + var url = $"{appInfo.Url}{string.Format(LifePaymentConstant.寰俊灏忕▼搴忚韩浠戒細璇濅俊鎭�, appInfo.AppId, appInfo.Secret, code)}"; + var result = await _commonManager.PostAsync<WxMiniAppIndentity>(url, null); + return result; + } + + + public async Task<WxMiniAppIndentity> GetWxOauth2AccessToken(string code) + { + var url = $"{_informationOption.RequestUrl}{string.Format(LifePaymentConstant.寰俊鍏紬鍙疯幏鍙朼ccess_token, _informationOption.AppId, _informationOption.AppSecret, code)}"; + var result = await _commonManager.PostAsync<WxMiniAppIndentity>(url, null); + return result; + } + + public async Task<GetCgiWritingResponse> GetWxPublishWriting() + { + var token = await GetWxCgiAccessToken(); + var input = new GetCgiWritingInput(); + input.AccessToken = token; + var url = $"{_wxOptions.Url}{string.Format(LifePaymentConstant.寰俊鎺ュ彛鑾峰彇鍏紬鍙锋枃绔�, token)}"; + var requestContent = new StringContent(JsonString.Object2Json(input), Encoding.UTF8, "application/json"); + var client = _httpClientFactory.CreateClient(LifePaymentConstant.WeChatHttpClientName); + var responseMessage = await client.PostAsync(url, requestContent); + var str = await responseMessage.Content.ReadAsStringAsync(); + var res = JsonConvert.DeserializeObject<GetCgiWritingResponse>(str); + return res; + } + + public string GetPhoneNumber(string encryptedDataStr, string iv, string sessionKey) + { + return GetUserInfo(encryptedDataStr, iv, sessionKey)?.PhoneNumber; + } + + public WxMiniAppUserInfo GetUserInfo(string encryptedDataStr, string iv, string sessionKey) + { + var result = string.Empty; + RijndaelManaged rijalg = new RijndaelManaged(); + rijalg.KeySize = 128; + rijalg.Padding = PaddingMode.PKCS7; + rijalg.Mode = CipherMode.CBC; + rijalg.Key = Convert.FromBase64String(sessionKey); + rijalg.IV = Convert.FromBase64String(iv); + byte[] encryptedData = Convert.FromBase64String(encryptedDataStr); + ICryptoTransform decryptor = rijalg.CreateDecryptor(rijalg.Key, rijalg.IV); + using (MemoryStream msDecrypt = new MemoryStream(encryptedData)) + { + using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read)) + { + using (StreamReader srDecrypt = new StreamReader(csDecrypt)) + { + result = srDecrypt.ReadToEnd(); + } + } + } + + return JsonConvert.DeserializeObject<WxMiniAppUserInfo>(result); + } + + private (string Url, string AppId, string Secret) GetAppInfoByEnum(WxMiniAppEnum wxMiniApp) + { + return wxMiniApp switch + { + WxMiniAppEnum.琛屼笟璧勮 => (_wxOptions.Url, _wxOptions.AppId, _wxOptions.Secret), + WxMiniAppEnum.浜哄崟鍚堜竴 => (_wxMatchMakingMiniAppOption.Url, _wxMatchMakingMiniAppOption.AppId, _wxMatchMakingMiniAppOption.Secret), + WxMiniAppEnum.鐢熸椿缂磋垂 => (_wxMatchMakingMiniAppOption.Url, _wxMatchMakingMiniAppOption.AppId, _wxMatchMakingMiniAppOption.Secret), + _ => throw new UserFriendlyException("瀛樺湪鏈疄鐜扮殑WxMiniAppEnum"), + }; + } + } +} \ No newline at end of file diff --git a/LifePayment/LifePayment.Domain/WeChat/WxPayApi.cs b/LifePayment/LifePayment.Domain/WeChat/WxPayApi.cs new file mode 100644 index 0000000..7f5612f --- /dev/null +++ b/LifePayment/LifePayment.Domain/WeChat/WxPayApi.cs @@ -0,0 +1,34 @@ +锘縰sing LifePayment.Domain.Shared; +using System.Threading.Tasks; + +namespace LifePayment.Domain +{ + public class WxPayApi : WxClient, IWxPayApi + { + public async Task<PayTransactionsNativeReponse> PayTransactionsNative(PayTransactionsNativeInput input) + { + var result = await PostAsync<PayTransactionsNativeInput, PayTransactionsNativeReponse>(input, LifePaymentConstant.PayTransactionsNative); + return result; + } + + public async Task<PayTransactionsReponse> PayTransactions(PayTransactionsInput input) + { + var result = await GetAsync<PayTransactionsInput, PayTransactionsReponse>(input, LifePaymentConstant.PayTransactions); + return result; + } + + public async Task<PayTransactionsH5Reponse> PayTransactionsH5(PayTransactionsNativeH5 input) + { + var result = await PostAsync<PayTransactionsNativeH5, PayTransactionsH5Reponse>(input, LifePaymentConstant.PayTransactionsH5); + return result; + } + + public async Task<ModelPayPrePayId> PayTransactionsJsAPI(ModelMiniPayRequest input) + { + var result = await PostAsync<ModelMiniPayRequest, ModelPayPrePayId>(input, LifePaymentConstant.PayJsApi); + return result; + } + + + } +} \ No newline at end of file diff --git a/LifePayment/LifePayment.Domain/WeChat/WxPayAuthenticationHandler.cs b/LifePayment/LifePayment.Domain/WeChat/WxPayAuthenticationHandler.cs new file mode 100644 index 0000000..d0c70bd --- /dev/null +++ b/LifePayment/LifePayment.Domain/WeChat/WxPayAuthenticationHandler.cs @@ -0,0 +1,82 @@ +锘縰sing LifePayment.Domain.Shared; +using Microsoft.AspNetCore.Authentication; +using Microsoft.AspNetCore.Http; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; +using Microsoft.Extensions.Primitives; +using System.Security.Authentication; +using System.Security.Claims; +using System.Text; +using System.Text.Encodings.Web; +using System.Threading.Tasks; + +namespace LifePayment.Domain +{ + public class WxPayAuthenticationHandler : AuthenticationHandler<AuthenticationSchemeOptions> + { + private readonly WxPayRsaHelper _wxPayRsaHelper; + + public WxPayAuthenticationHandler( + IOptionsMonitor<AuthenticationSchemeOptions> options, + ILoggerFactory logger, + UrlEncoder encoder, + ISystemClock clock, + WxPayRsaHelper wxPayRsaHelper) : base(options, logger, encoder, clock) + { + _wxPayRsaHelper = wxPayRsaHelper; + } + + protected async override Task<AuthenticateResult> HandleAuthenticateAsync() + { + StringValues signature; + StringValues wechatpayNonce; + StringValues timespan; + var exist = Request.Headers.TryGetValue("Wechatpay-Signature", out signature); + if (!exist) + { + return AuthenticateResult.Fail("Wechatpay-Signature 404"); + } + + var wechatpayNonceExist = Request.Headers.TryGetValue("Wechatpay-Nonce", out wechatpayNonce); + if (!wechatpayNonceExist) + { + return AuthenticateResult.Fail("Wechatpay-Nonce 404"); + } + + var timespanExist = Request.Headers.TryGetValue("Wechatpay-Timestamp", out timespan); + if (!timespanExist) + { + return AuthenticateResult.Fail("Wechatpay-Timestamp 404"); + } + + Request.EnableBuffering(); + var bytes = new byte[Request.ContentLength ?? 0]; + var bt = 1; + while (bt > 0) + { + bt = await Request.Body.ReadAsync(bytes, 0, (int)(Request.ContentLength ?? 0)); + } + + var str = Encoding.Default.GetString(bytes); + Request.Body.Position = 0; + var mySign = BuildAuth(timespan.ToString(), wechatpayNonce.ToString(), str); + var check = _wxPayRsaHelper.Verify(mySign, signature.ToString()); + if (check) + { + var claimIdentity = new ClaimsIdentity("WxPayIdentity"); + var principal = new ClaimsPrincipal(claimIdentity); + return AuthenticateResult.Success(new AuthenticationTicket(principal, WxPaySignAuthenticationDefaults.AuthenticationScheme)); + } + else + { + return AuthenticateResult.Fail(new AuthenticationException("楠岀澶辫触")); + } + } + + private string BuildAuth(string timeSpan, string nonce, string body) + { + var str = $"{timeSpan}\n{nonce}\n{body}\n"; + return str; + } + } +} \ No newline at end of file diff --git a/LifePayment/LifePayment.Domain/WeChat/WxPayExtensions.cs b/LifePayment/LifePayment.Domain/WeChat/WxPayExtensions.cs new file mode 100644 index 0000000..ac2606d --- /dev/null +++ b/LifePayment/LifePayment.Domain/WeChat/WxPayExtensions.cs @@ -0,0 +1,13 @@ +锘縰sing LifePayment.Domain.Shared; +using Microsoft.AspNetCore.Authentication; + +namespace LifePayment.Domain +{ + public static class WxPayExtensions + { + public static AuthenticationBuilder AddWxPay(this AuthenticationBuilder builder) + { + return builder.AddScheme<AuthenticationSchemeOptions, WxPayAuthenticationHandler>(WxPaySignAuthenticationDefaults.AuthenticationScheme, "WxPaySignCheck", op => { }); + } + } +} \ No newline at end of file diff --git a/LifePayment/LifePayment.Domain/WeChat/WxPayRsaHelper.cs b/LifePayment/LifePayment.Domain/WeChat/WxPayRsaHelper.cs new file mode 100644 index 0000000..d1ccfc2 --- /dev/null +++ b/LifePayment/LifePayment.Domain/WeChat/WxPayRsaHelper.cs @@ -0,0 +1,16 @@ +锘縰sing LifePayment.Domain.Shared; +using Microsoft.Extensions.Options; +using System.Text; +using Volo.Abp.DependencyInjection; +using ZeroD.IO; + +namespace LifePayment.Domain +{ + public class WxPayRsaHelper : RSABase, ISingletonDependency + { + public WxPayRsaHelper(IOptionsMonitor<WxPayOption> optionsMonitor) + : base(RSAType.RSA2, Encoding.UTF8, optionsMonitor.CurrentValue.APIPrivateKey, optionsMonitor.CurrentValue.APIPublicKey) + { + } + } +} \ No newline at end of file diff --git a/LifePayment/LifePayment.EntityFrameworkCore/LifePaymentServicesDbContext.cs b/LifePayment/LifePayment.EntityFrameworkCore/LifePaymentServicesDbContext.cs index 6a79923..5b0d428 100644 --- a/LifePayment/LifePayment.EntityFrameworkCore/LifePaymentServicesDbContext.cs +++ b/LifePayment/LifePayment.EntityFrameworkCore/LifePaymentServicesDbContext.cs @@ -1,4 +1,5 @@ using LifePayment.Domain; +using LifePayment.Domain.Models; using Microsoft.EntityFrameworkCore; using Volo.Abp.Data; using Volo.Abp.EntityFrameworkCore; @@ -15,6 +16,12 @@ } + public virtual DbSet<LifePayUser> LifePayUser { get; set; } + + public virtual DbSet<LifePayOrder> LifePayOrder { get; set; } + + public virtual DbSet<LifePayRate> LifePayRate { get; set; } + [UnitOfWork] protected override void OnModelCreating(ModelBuilder builder) { diff --git a/LifePayment/LifePayment.Host/LifePaymentService.HttpApi.xml b/LifePayment/LifePayment.Host/LifePaymentService.HttpApi.xml index 6ff060e..5e3ecad 100644 --- a/LifePayment/LifePayment.Host/LifePaymentService.HttpApi.xml +++ b/LifePayment/LifePayment.Host/LifePaymentService.HttpApi.xml @@ -4,5 +4,93 @@ <name>LifePayment.HttpApi</name> </assembly> <members> + <member name="M:LifePayment.HttpApi.LifePayController.GetElectricParValue"> + <summary> + 鑾峰彇鐢佃垂闈㈠�� + </summary> + <returns></returns> + </member> + <member name="M:LifePayment.HttpApi.LifePayController.GetElectricSupportArea"> + <summary> + 鑾峰彇鐢佃垂鍏呭�煎尯鍩� + </summary> + <returns></returns> + </member> + <member name="M:LifePayment.HttpApi.LifePayController.GetPhoneParValue"> + <summary> + 鑾峰彇璇濊垂闈㈠�� + </summary> + <returns></returns> + </member> + <member name="M:LifePayment.HttpApi.LifePayController.GetRate"> + <summary> + 鑾峰彇鎶樻墸 + </summary> + <returns></returns> + </member> + <member name="M:LifePayment.HttpApi.LifePayController.GetUserPage(ZeroD.Util.PageInput)"> + <summary> + 鑾峰彇鐢ㄦ埛鍒嗛〉鏁版嵁 + </summary> + <param name="input"></param> + <returns></returns> + </member> + <member name="M:LifePayment.HttpApi.LifePayController.GetLifePayOrderPage(LifePayment.Application.Contracts.QueryLifePayOrderListInput)"> + <summary> + 鑾峰彇璁㈠崟鍒嗛〉鏁版嵁 + </summary> + <param name="input"></param> + <returns></returns> + </member> + <member name="M:LifePayment.HttpApi.LifePayController.GetUserLifePayOrderPage(LifePayment.Application.Contracts.QueryLifePayOrderListInput)"> + <summary> + 鑾峰彇鎴戠殑璁㈠崟鍒嗛〉鏁版嵁 + </summary> + <param name="input"></param> + <returns></returns> + </member> + <member name="M:LifePayment.HttpApi.LifePayController.GetPayStatusByOrderNo(System.String)"> + <summary> + 鏍规嵁璁㈠崟鍙疯幏鍙栨敮浠樼姸鎬� + </summary> + <param name="orderNo"></param> + <returns></returns> + </member> + <member name="M:LifePayment.HttpApi.LifePayController.CreateLifePayPhoneOrder(LifePayment.Application.Contracts.CreateLifePayOrderInput{LifePayment.Application.Contracts.LifePhoneData})"> + <summary> + 鍒涘缓鐢熸椿缂磋垂璇濊垂璁㈠崟 + </summary> + <param name="input"></param> + <returns></returns> + </member> + <member name="M:LifePayment.HttpApi.LifePayController.CreateLifePayElectricOrder(LifePayment.Application.Contracts.CreateLifePayOrderInput{LifePayment.Application.Contracts.LifeElectricData})"> + <summary> + 鍒涘缓鐢熸椿缂磋垂鐢佃垂璁㈠崟 + </summary> + <param name="input"></param> + <returns></returns> + </member> + <member name="M:LifePayment.HttpApi.LifePayController.RefundLifePayOrder(LifePayment.Application.Contracts.RefundLifePayOrderInput)"> + <summary> + 閫�娆剧敓娲荤即璐硅鍗� + </summary> + <param name="input"></param> + <returns></returns> + <exception cref="T:Volo.Abp.UserFriendlyException"></exception> + </member> + <member name="M:LifePayment.HttpApi.LifePayController.SetLifePayOrderPayType(LifePayment.Domain.Shared.SetLifePayOrderPayTypeInput)"> + <summary> + 璁剧疆鐢熸椿缂磋垂鏀粯绫诲瀷 + </summary> + <param name="input"></param> + <returns></returns> + </member> + <member name="M:LifePayment.HttpApi.LifePayController.GetPayOrderForJsAPI(LifePayment.Domain.Shared.GetPayOrderForJsAPIInput)"> + <summary> + 鑾峰彇寰俊鏀粯鐨凧SAPI + </summary> + <param name="input"></param> + <returns></returns> + </member> </members> </doc> diff --git a/LifePayment/LifePayment.Host/LifePaymentServices.Application.Contracts.xml b/LifePayment/LifePayment.Host/LifePaymentServices.Application.Contracts.xml index cf24732..701d5bf 100644 --- a/LifePayment/LifePayment.Host/LifePaymentServices.Application.Contracts.xml +++ b/LifePayment/LifePayment.Host/LifePaymentServices.Application.Contracts.xml @@ -4,5 +4,457 @@ <name>LifePayment.Application.Contracts</name> </assembly> <members> + <member name="M:LifePayment.Application.Contracts.ILifePayService.GetElectricParValue"> + <summary> + 鑾峰彇鐢佃垂闈㈠�� + </summary> + <returns></returns> + </member> + <member name="M:LifePayment.Application.Contracts.ILifePayService.GetElectricSupportArea"> + <summary> + 鑾峰彇鐢佃垂鍏呭�煎尯鍩� + </summary> + <returns></returns> + </member> + <member name="M:LifePayment.Application.Contracts.ILifePayService.GetPhoneParValue"> + <summary> + 鑾峰彇璇濊垂闈㈠�� + </summary> + <returns></returns> + </member> + <member name="M:LifePayment.Application.Contracts.ILifePayService.LifePaySuccessHandler(System.String,System.String)"> + <summary> + 鏀粯鎴愬姛鍥炶皟澶勭悊 + </summary> + <param name="orderNo"></param> + <param name="outOrderNo"></param> + <returns></returns> + </member> + <member name="M:LifePayment.Application.Contracts.ILifePayService.ACOOLYOrderNotifyHandler(System.String,System.String,LifePayment.Domain.Shared.LifePayOrderStatusEnum)"> + <summary> + 鏀粯鎴愬姛鍥炶皟澶勭悊 + </summary> + <param name="orderNo"></param> + <param name="acoolyOrderNo"></param> + <param name="status"></param> + <returns></returns> + </member> + <member name="M:LifePayment.Application.Contracts.ILifePayService.CreateLifePayPhoneOrder(LifePayment.Application.Contracts.CreateLifePayOrderInput{LifePayment.Application.Contracts.LifePhoneData})"> + <summary> + 鍒涘缓鐢熸椿缂磋垂璇濊垂璁㈠崟 + </summary> + <param name="input"></param> + <returns></returns> + </member> + <member name="M:LifePayment.Application.Contracts.ILifePayService.CreateLifePayElectricOrder(LifePayment.Application.Contracts.CreateLifePayOrderInput{LifePayment.Application.Contracts.LifeElectricData})"> + <summary> + 鍒涘缓鐢熸椿缂磋垂鐢佃垂璁㈠崟 + </summary> + <param name="input"></param> + <returns></returns> + </member> + <member name="M:LifePayment.Application.Contracts.ILifePayService.RefundLifePayOrder(LifePayment.Application.Contracts.RefundLifePayOrderInput)"> + <summary> + 閫�娆剧敓娲荤即璐硅鍗� + </summary> + <param name="input"></param> + <returns></returns> + <exception cref="T:Volo.Abp.UserFriendlyException"></exception> + </member> + <member name="M:LifePayment.Application.Contracts.ILifePayService.GetRate"> + <summary> + 鑾峰彇鎶樻墸 + </summary> + <returns></returns> + </member> + <member name="M:LifePayment.Application.Contracts.ILifePayService.GetUserLifePayOrderPage(LifePayment.Application.Contracts.QueryLifePayOrderListInput)"> + <summary> + 鑾峰彇鎴戠殑璁㈠崟鍒嗛〉鏁版嵁 + </summary> + <param name="input"></param> + <returns></returns> + </member> + <member name="M:LifePayment.Application.Contracts.ILifePayService.GetUserPage(ZeroD.Util.PageInput)"> + <summary> + 鑾峰彇鐢ㄦ埛鍒嗛〉鏁版嵁 + </summary> + <param name="input"></param> + <returns></returns> + </member> + <member name="M:LifePayment.Application.Contracts.ILifePayService.GetLifePayOrderPage(LifePayment.Application.Contracts.QueryLifePayOrderListInput)"> + <summary> + 鑾峰彇璁㈠崟鍒嗛〉鏁版嵁 + </summary> + <param name="input"></param> + <returns></returns> + </member> + <member name="M:LifePayment.Application.Contracts.ILifePayService.GetPayStatusByOrderNo(System.String)"> + <summary> + 鏍规嵁璁㈠崟鍙疯幏鍙栨敮浠樼姸鎬� + </summary> + <param name="orderNo"></param> + <returns></returns> + </member> + <member name="M:LifePayment.Application.Contracts.ILifePayService.SetLifePayOrderPayType(LifePayment.Domain.Shared.SetLifePayOrderPayTypeInput,System.String)"> + <summary> + 璁剧疆鐢熸椿缂磋垂鏀粯绫诲瀷 + </summary> + <param name="input"></param> + <returns></returns> + </member> + <member name="M:LifePayment.Application.Contracts.ILifePayService.GetPayOrderForJsAPI(LifePayment.Domain.Shared.GetPayOrderForJsAPIInput,System.String)"> + <summary> + 鐢熸椿缂磋垂鐨凧SAPI璋冪敤 + </summary> + <param name="input"></param> + <param name="ip"></param> + <returns></returns> + </member> + <member name="M:LifePayment.Application.Contracts.ILifePayService.GetPayQRCode(LifePayment.Domain.Shared.LifePayTypeEnum,System.String,System.String,System.Decimal,System.String,System.String)"> + <summary> + 鑾峰彇鏀粯浜岀淮鐮� + </summary> + <param name="payType"></param> + <param name="outTradeNo"></param> + <param name="description"></param> + <param name="amount"></param> + <returns></returns> + <exception cref="T:Volo.Abp.UserFriendlyException"></exception> + </member> + <member name="P:LifePayment.Application.Contracts.LifePhoneData.IspCode"> + <summary> + 杩愯惀鍟嗙紪鐮侊紝渚嬪锛�"yidong", "dianxin", "liantong"銆� + </summary> + </member> + <member name="P:LifePayment.Application.Contracts.LifePhoneData.ParValue"> + <summary> + 鍏呭�奸潰棰濓紝鍗曚綅涓哄厓銆傛祴璇曡处鎴凤細parValue=100:缂磋垂鎴愬姛锛宲arValue>100锛氱即璐瑰け璐ャ�� + </summary> + </member> + <member name="P:LifePayment.Application.Contracts.LifePhoneData.Phone"> + <summary> + 鎵嬫満鍙枫�� + </summary> + </member> + <member name="P:LifePayment.Application.Contracts.LifePhoneData.Name"> + <summary> + 鏈轰富鍚嶇О(鐢典俊鎵嬫満鍙峰繀濉�) + </summary> + </member> + <member name="P:LifePayment.Application.Contracts.LifeElectricData.ParValue"> + <summary> + 鍏呭�奸潰棰濓紝鍗曚綅涓哄厓銆� + </summary> + </member> + <member name="P:LifePayment.Application.Contracts.LifeElectricData.ElectricType"> + <summary> + 鐢电綉绫诲瀷锛屼緥濡傦細"guowang"浠h〃鍥藉鐢电綉锛�"nanwang"浠h〃鍗楁柟鐢电綉銆� + </summary> + </member> + <member name="P:LifePayment.Application.Contracts.LifeElectricData.ElectricAccountType"> + <summary> + 鐢佃垂绫诲瀷锛屽浗缃戝繀浼狅細浣忓畢銆佷紒浜嬩笟銆佸簵閾轰笁涓�夐」銆� + </summary> + </member> + <member name="P:LifePayment.Application.Contracts.LifeElectricData.ElectricAccount"> + <summary> + 鐢佃垂鎴峰彿銆� + </summary> + </member> + <member name="P:LifePayment.Application.Contracts.LifeElectricData.Province"> + <summary> + 鐪佷唤銆� + </summary> + </member> + <member name="P:LifePayment.Application.Contracts.LifeElectricData.City"> + <summary> + 鍩庡競銆� + </summary> + </member> + <member name="P:LifePayment.Application.Contracts.LifeElectricData.SixID"> + <summary> + 瀹㈡埛韬唤璇佸悗6浣嶏紝鍗楃綉蹇呬紶銆� + </summary> + </member> + <member name="P:LifePayment.Application.Contracts.CreateLifePayOrderInput.PhoneNumber"> + <summary> + 鐢ㄦ埛鎵嬫満鍙� + </summary> + </member> + <member name="P:LifePayment.Application.Contracts.CreateLifePayOrderInput.LifePayOrderType"> + <summary> + 璁㈠崟绫诲瀷 + </summary> + </member> + <member name="P:LifePayment.Application.Contracts.CreateLifePayOrderInput.OrderNo"> + <summary> + 璁㈠崟鍙� + </summary> + </member> + <member name="P:LifePayment.Application.Contracts.CreateLifePayOrderInput.RechargeAmount"> + <summary> + 鍏呭�奸噾棰� + </summary> + </member> + <member name="P:LifePayment.Application.Contracts.CreateLifePayOrderInput.DiscountAmount"> + <summary> + 浼樻儬閲戦 + </summary> + </member> + <member name="P:LifePayment.Application.Contracts.CreateLifePayOrderInput.PayAmount"> + <summary> + 瀹炰粯閲戦 + </summary> + </member> + <member name="P:LifePayment.Application.Contracts.CreateLifePayOrderInput.PayTime"> + <summary> + 鏀粯鏃堕棿 + </summary> + </member> + <member name="P:LifePayment.Application.Contracts.CreateLifePayOrderInput.PayStatus"> + <summary> + 鏀粯鐘舵�� + </summary> + </member> + <member name="P:LifePayment.Application.Contracts.CreateLifePayOrderInput.OutOrderNo"> + <summary> + 澶栭儴璁㈠崟鍙� + </summary> + </member> + <member name="P:LifePayment.Application.Contracts.CreateLifePayOrderInput.LifePayOrderStatus"> + <summary> + 璁㈠崟鐘舵�� + </summary> + </member> + <member name="P:LifePayment.Application.Contracts.CreateLifePayOrderInput.FinishTime"> + <summary> + 瀹屾垚鏃堕棿 + </summary> + </member> + <member name="P:LifePayment.Application.Contracts.CreateLifePayOrderInput.RefundCredentialsImgUrl"> + <summary> + 閫�娆惧嚟璇� + </summary> + </member> + <member name="P:LifePayment.Application.Contracts.CreateLifePayOrderInput.OrderParamDetailJsonStr"> + <summary> + 璁㈠崟鍙傛暟璇︽儏 + </summary> + </member> + <member name="P:LifePayment.Application.Contracts.QueryLifePayOrderListInput.LifePayOrderType"> + <summary> + 璁㈠崟绫诲瀷 + </summary> + </member> + <member name="P:LifePayment.Application.Contracts.QueryLifePayOrderListInput.BeginPayTime"> + <summary> + 寮�濮嬫敮浠樻椂闂� + </summary> + </member> + <member name="P:LifePayment.Application.Contracts.QueryLifePayOrderListInput.EndPayTime"> + <summary> + 缁撴潫鏀粯鏃堕棿 + </summary> + </member> + <member name="P:LifePayment.Application.Contracts.QueryLifePayOrderListInput.PayStatus"> + <summary> + 鏀粯鐘舵�� + </summary> + </member> + <member name="P:LifePayment.Application.Contracts.QueryLifePayOrderListInput.LifePayOrderStatus"> + <summary> + 璁㈠崟鐘舵�� + </summary> + </member> + <member name="P:LifePayment.Application.Contracts.QueryLifePayOrderListInput.BeginFinishTime"> + <summary> + 寮�濮嬪畬鎴愭椂闂� + </summary> + </member> + <member name="P:LifePayment.Application.Contracts.QueryLifePayOrderListInput.EndFinishTime"> + <summary> + 缁撴潫瀹屾垚鏃堕棿 + </summary> + </member> + <member name="P:LifePayment.Application.Contracts.QueryLifePayOrderListInput.UserId"> + <summary> + 鐢ㄦ埛Id + </summary> + </member> + <member name="P:LifePayment.Application.Contracts.UserListOutput.PhoneNumber"> + <summary> + 鐢ㄦ埛鎵嬫満鍙� + </summary> + </member> + <member name="P:LifePayment.Application.Contracts.LifePayOrderListOutput.PhoneNumber"> + <summary> + 鐢ㄦ埛鎵嬫満鍙� + </summary> + </member> + <member name="P:LifePayment.Application.Contracts.LifePayOrderListOutput.LifePayType"> + <summary> + 鐢熸椿缂磋垂鏀粯绫诲瀷 + </summary> + </member> + <member name="P:LifePayment.Application.Contracts.LifePayOrderListOutput.LifePayOrderType"> + <summary> + 璁㈠崟绫诲瀷 + </summary> + </member> + <member name="P:LifePayment.Application.Contracts.LifePayOrderListOutput.OrderNo"> + <summary> + 璁㈠崟鍙� + </summary> + </member> + <member name="P:LifePayment.Application.Contracts.LifePayOrderListOutput.RechargeAmount"> + <summary> + 鍏呭�奸噾棰� + </summary> + </member> + <member name="P:LifePayment.Application.Contracts.LifePayOrderListOutput.DiscountAmount"> + <summary> + 浼樻儬閲戦 + </summary> + </member> + <member name="P:LifePayment.Application.Contracts.LifePayOrderListOutput.PayAmount"> + <summary> + 瀹炰粯閲戦 + </summary> + </member> + <member name="P:LifePayment.Application.Contracts.LifePayOrderListOutput.PayTime"> + <summary> + 鏀粯鏃堕棿 + </summary> + </member> + <member name="P:LifePayment.Application.Contracts.LifePayOrderListOutput.PayStatus"> + <summary> + 鏀粯鐘舵�� + </summary> + </member> + <member name="P:LifePayment.Application.Contracts.LifePayOrderListOutput.OutOrderNo"> + <summary> + 澶栭儴璁㈠崟鍙� + </summary> + </member> + <member name="P:LifePayment.Application.Contracts.LifePayOrderListOutput.LifePayOrderStatus"> + <summary> + 璁㈠崟鐘舵�� + </summary> + </member> + <member name="P:LifePayment.Application.Contracts.LifePayOrderListOutput.FinishTime"> + <summary> + 瀹屾垚鏃堕棿 + </summary> + </member> + <member name="P:LifePayment.Application.Contracts.LifePayOrderListOutput.RefundCredentialsImgUrl"> + <summary> + 閫�娆惧嚟璇� + </summary> + </member> + <member name="P:LifePayment.Application.Contracts.LifePayOrderListOutput.CreationTime"> + <summary> + 涓嬪崟鏃堕棿 + </summary> + </member> + <member name="P:LifePayment.Application.Contracts.UserLifePayOrderOutput.LifePayType"> + <summary> + 鐢熸椿缂磋垂鏀粯绫诲瀷 + </summary> + </member> + <member name="P:LifePayment.Application.Contracts.UserLifePayOrderOutput.LifePayOrderType"> + <summary> + 璁㈠崟绫诲瀷 + </summary> + </member> + <member name="P:LifePayment.Application.Contracts.UserLifePayOrderOutput.OrderNo"> + <summary> + 璁㈠崟鍙� + </summary> + </member> + <member name="P:LifePayment.Application.Contracts.UserLifePayOrderOutput.RechargeAmount"> + <summary> + 鍏呭�奸噾棰� + </summary> + </member> + <member name="P:LifePayment.Application.Contracts.UserLifePayOrderOutput.DiscountAmount"> + <summary> + 浼樻儬閲戦 + </summary> + </member> + <member name="P:LifePayment.Application.Contracts.UserLifePayOrderOutput.PayAmount"> + <summary> + 瀹炰粯閲戦 + </summary> + </member> + <member name="P:LifePayment.Application.Contracts.UserLifePayOrderOutput.PayTime"> + <summary> + 鏀粯鏃堕棿 + </summary> + </member> + <member name="P:LifePayment.Application.Contracts.UserLifePayOrderOutput.PayStatus"> + <summary> + 鏀粯鐘舵�� + </summary> + </member> + <member name="P:LifePayment.Application.Contracts.UserLifePayOrderOutput.LifePayOrderStatus"> + <summary> + 璁㈠崟鐘舵�� + </summary> + </member> + <member name="P:LifePayment.Application.Contracts.UserLifePayOrderOutput.FinishTime"> + <summary> + 瀹屾垚鏃堕棿 + </summary> + </member> + <member name="P:LifePayment.Application.Contracts.UserLifePayOrderOutput.OrderParamDetailJsonStr"> + <summary> + 璁㈠崟璇︾粏鏁版嵁 + </summary> + </member> + <member name="P:LifePayment.Application.Contracts.UserLifePayOrderOutput.CreationTime"> + <summary> + 涓嬪崟鏃堕棿 + </summary> + </member> + <member name="P:LifePayment.Application.Contracts.UserLifePayOrderOutput.RefundTime"> + <summary> + 閫�娆炬椂闂� + </summary> + </member> + <member name="P:LifePayment.Application.Contracts.RecordOperateHistoryEto.RelationId"> + <summary> + 鍏宠仈鍏崇郴ID + </summary> + </member> + <member name="P:LifePayment.Application.Contracts.RecordOperateHistoryEto.TableType"> + <summary> + 琛ㄧ被鍨� 甯搁噺 TableType + </summary> + </member> + <member name="P:LifePayment.Application.Contracts.RecordOperateHistoryEto.OperateName"> + <summary> + 鎿嶄綔鍚嶇О + </summary> + </member> + <member name="P:LifePayment.Application.Contracts.RecordOperateHistoryEto.OperateContent"> + <summary> + 鎿嶄綔鍐呭 + </summary> + </member> + <member name="P:LifePayment.Application.Contracts.RecordOperateHistoryEto.CreatorName"> + <summary> + 鎿嶄綔浜� + </summary> + </member> + <member name="P:LifePayment.Application.Contracts.RecordOperateHistoryEto.OperateDetail"> + <summary> + 鎿嶄綔缁嗚妭 + </summary> + </member> + <member name="P:LifePayment.Application.Contracts.RecordOperateHistoryEto.UserId"> + <summary> + 鐢ㄦ埛id + </summary> + </member> </members> </doc> diff --git a/LifePayment/LifePayment.HttpApi/LifePay/LifePayController.cs b/LifePayment/LifePayment.HttpApi/LifePay/LifePayController.cs new file mode 100644 index 0000000..41631d2 --- /dev/null +++ b/LifePayment/LifePayment.HttpApi/LifePay/LifePayController.cs @@ -0,0 +1,214 @@ +锘縰sing LifePayment.Application.Contracts; +using LifePayment.Domain; +using LifePayment.Domain.Shared; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Volo.Abp; +using Volo.Abp.AspNetCore.Mvc; +using Volo.Abp.AspNetCore.WebClientInfo; +using Volo.Abp.EventBus.Distributed; +using Volo.Abp.Identity; +using Volo.Abp.Uow; +using ZeroD.Util; +using ZeroD.Util.Fadd; +using LifePayment.Application.Contracts; + +namespace LifePayment.HttpApi +{ + [Route("api/[controller]/[action]")] + [ApiController] + [Authorize] + public class LifePayController : AbpController + { + private readonly ILifePayService _lifePayService; + private readonly IWebClientInfoProvider _webClientInfoProvider; + public LifePayController( + ILifePayService lifePayService, + IWebClientInfoProvider webClientInfoProvider + ) + { + _lifePayService = lifePayService; + _webClientInfoProvider = webClientInfoProvider; + } + + #region 鏌ヨ + + /// <summary> + /// 鑾峰彇鐢佃垂闈㈠�� + /// </summary> + /// <returns></returns> + [HttpGet] + [AllowAnonymous] + public async Task<ElectricParValueResponse> GetElectricParValue() + { + return await _lifePayService.GetElectricParValue(); + } + + /// <summary> + /// 鑾峰彇鐢佃垂鍏呭�煎尯鍩� + /// </summary> + /// <returns></returns> + [HttpGet] + [AllowAnonymous] + public async Task<ElectricSupportAreaResponse> GetElectricSupportArea() + { + var aresResult = await _lifePayService.GetElectricSupportArea(); + var parValues = await _lifePayService.GetElectricParValue(); + + foreach(var item in aresResult.ElectricAreaList) + { + var paritem = parValues.ElectricParValue.Where(r=>r.AreaName == item.CityName).FirstOrDefault(); + if(paritem != null) + { + item.ElectricType = paritem.ElectricType; + item.ParValue = paritem.ParValue; + item.Rate = paritem.Rate; + } + } + + return aresResult; + } + + /// <summary> + /// 鑾峰彇璇濊垂闈㈠�� + /// </summary> + /// <returns></returns> + [HttpGet] + [AllowAnonymous] + public async Task<PhoneParValueResponse> GetPhoneParValue() + { + return await _lifePayService.GetPhoneParValue(); + } + + /// <summary> + /// 鑾峰彇鎶樻墸 + /// </summary> + /// <returns></returns> + [HttpGet] + [AllowAnonymous] + public async Task<List<LifePayRateListOutput>> GetRate() + { + return await _lifePayService.GetRate(); + } + + /// <summary> + /// 鑾峰彇鐢ㄦ埛鍒嗛〉鏁版嵁 + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + [HttpPost] + public async Task<PageOutput<UserListOutput>> GetUserPage(PageInput input) + { + return await _lifePayService.GetUserPage(input); + } + + /// <summary> + /// 鑾峰彇璁㈠崟鍒嗛〉鏁版嵁 + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + [HttpPost] + public async Task<PageOutput<LifePayOrderListOutput>> GetLifePayOrderPage(QueryLifePayOrderListInput input) + { + return await _lifePayService.GetLifePayOrderPage(input); + } + + /// <summary> + /// 鑾峰彇鎴戠殑璁㈠崟鍒嗛〉鏁版嵁 + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + [HttpPost] + [AllowAnonymous] + public async Task<PageOutput<UserLifePayOrderOutput>> GetUserLifePayOrderPage(QueryLifePayOrderListInput input) + { + return await _lifePayService.GetUserLifePayOrderPage(input); + } + + /// <summary> + /// 鏍规嵁璁㈠崟鍙疯幏鍙栨敮浠樼姸鎬� + /// </summary> + /// <param name="orderNo"></param> + /// <returns></returns> + [HttpGet] + [AllowAnonymous] + public async Task<LifePayStatusEnum> GetPayStatusByOrderNo(string orderNo) + { + return await _lifePayService.GetPayStatusByOrderNo(orderNo); + } + + #endregion + + #region 鎿嶄綔 + + /// <summary> + /// 鍒涘缓鐢熸椿缂磋垂璇濊垂璁㈠崟 + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + [HttpPost] + [AllowAnonymous] + public async Task<CreateLifePayOrderOutput> CreateLifePayPhoneOrder(CreateLifePayOrderInput<LifePhoneData> input) + { + return await _lifePayService.CreateLifePayPhoneOrder(input); + } + + /// <summary> + /// 鍒涘缓鐢熸椿缂磋垂鐢佃垂璁㈠崟 + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + [HttpPost] + [AllowAnonymous] + public async Task<CreateLifePayOrderOutput> CreateLifePayElectricOrder(CreateLifePayOrderInput<LifeElectricData> input) + { + return await _lifePayService.CreateLifePayElectricOrder(input); + } + + /// <summary> + /// 閫�娆剧敓娲荤即璐硅鍗� + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + /// <exception cref="UserFriendlyException"></exception> + [HttpPost] + public async Task<int> RefundLifePayOrder(RefundLifePayOrderInput input) + { + await _lifePayService.RefundLifePayOrder(input); + return Constant.SUCCESS; + } + + /// <summary> + /// 璁剧疆鐢熸椿缂磋垂鏀粯绫诲瀷 + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + [HttpPost] + [AllowAnonymous] + public async Task<string> SetLifePayOrderPayType(SetLifePayOrderPayTypeInput input) + { + + return await _lifePayService.SetLifePayOrderPayType(input, _webClientInfoProvider.ClientIpAddress); + } + + /// <summary> + /// 鑾峰彇寰俊鏀粯鐨凧SAPI + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + [HttpPost] + [AllowAnonymous] + public async Task<ModelPaymentMiniPay> GetPayOrderForJsAPI(GetPayOrderForJsAPIInput input) + { + return await _lifePayService.GetPayOrderForJsAPI(input, _webClientInfoProvider.ClientIpAddress); + } + + #endregion + + } +} \ No newline at end of file -- Gitblit v1.9.1