FlexJobApi.Core/Entities/UserServer/Enterprises/EnterpriseWallet.cs
@@ -25,5 +25,77 @@ /// 通道 /// </summary> public EnumEnterpriseWalletAccess Access { get; set; } /// <summary> /// 协议产品码,商户和支付宝签约时确定,不同业务场景对应不同的签约产品码。 /// </summary> public string PersonalProductCode { get; set; } /// <summary> /// 签约协议的场景。 /// </summary> public string SignScene { get; set; } /// <summary> /// 签约第三方主体类型。对于三方协议,表示当前用户和哪一类的第三方主体进行签约。 默认为PARTNER。 /// </summary> public string ThirdPartyType { get; set; } /// <summary> /// 销售产品码,商户签约的支付宝合同所对应的产品码。 /// </summary> public string ProductCode { get; set; } /// <summary> /// 协议号 /// </summary> public string Code { get; set; } /// <summary> /// 通道协议号 /// </summary> public string AgreementNo { get; set; } /// <summary> /// 协议签约时间 /// </summary> public DateTime? SignTime { get; set; } /// <summary> /// 协议生效时间 /// </summary> public DateTime? ValidTime { get; set; } /// <summary> /// 协议失效时间 /// </summary> public DateTime? InvalidTime { get; set; } /// <summary> /// 签约状态 /// </summary> public EnumEnterpriseWalletSignStatus SignStatus { get; set; } /// <summary> /// 签约主体类型。 /// </summary> public string PricipalType { get; set; } /// <summary> /// 脱敏的支付宝账号 /// </summary> public string AlipayLogonId { get; set; } /// <summary> /// 签约主体标识。 当principal_type为CARD 时,该字段为支付宝用户号; /// </summary> public string PrincipalId { get; set; } /// <summary> /// 签约主体标识。 当principal_type为CARD 时,该字段为支付宝用户号; /// </summary> public string PrincipalOpenId { get; set; } /// <summary> /// 用户的芝麻信用 openId,供商 户查询用户芝麻信用使用。 /// </summary> public string ZmOpenId { get; set; } /// <summary> /// 授信模式,目前只在花芝代扣(即花芝go)协议时才会返回 /// </summary> public string CreditAuthMode { get; set; } } } FlexJobApi.Core/Enums/Users/EnumEnterpriseWalletSignStatus.cs
New file @@ -0,0 +1,27 @@ using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace FlexJobApi.Core { /// <summary> /// 企业钱包签约状态 /// </summary> public enum EnumEnterpriseWalletSignStatus { /// <summary> /// 申请中 /// </summary> Apply = 10, /// <summary> /// 已签约 /// </summary> Normal = 100, /// <summary> /// 终止 /// </summary> Stop = 999 } } FlexJobApi.Core/FlexJobApi.Core.xml
@@ -2055,6 +2055,86 @@ 通道 </summary> </member> <member name="P:FlexJobApi.Core.EnterpriseWallet.PersonalProductCode"> <summary> 协议产品码,商户和支付宝签约时确定,不同业务场景对应不同的签约产品码。 </summary> </member> <member name="P:FlexJobApi.Core.EnterpriseWallet.SignScene"> <summary> 签约协议的场景。 </summary> </member> <member name="P:FlexJobApi.Core.EnterpriseWallet.ThirdPartyType"> <summary> 签约第三方主体类型。对于三方协议,表示当前用户和哪一类的第三方主体进行签约。 默认为PARTNER。 </summary> </member> <member name="P:FlexJobApi.Core.EnterpriseWallet.ProductCode"> <summary> 销售产品码,商户签约的支付宝合同所对应的产品码。 </summary> </member> <member name="P:FlexJobApi.Core.EnterpriseWallet.Code"> <summary> 协议号 </summary> </member> <member name="P:FlexJobApi.Core.EnterpriseWallet.AgreementNo"> <summary> 通道协议号 </summary> </member> <member name="P:FlexJobApi.Core.EnterpriseWallet.SignTime"> <summary> 协议签约时间 </summary> </member> <member name="P:FlexJobApi.Core.EnterpriseWallet.ValidTime"> <summary> 协议生效时间 </summary> </member> <member name="P:FlexJobApi.Core.EnterpriseWallet.InvalidTime"> <summary> 协议失效时间 </summary> </member> <member name="P:FlexJobApi.Core.EnterpriseWallet.SignStatus"> <summary> 签约状态 </summary> </member> <member name="P:FlexJobApi.Core.EnterpriseWallet.PricipalType"> <summary> 签约主体类型。 </summary> </member> <member name="P:FlexJobApi.Core.EnterpriseWallet.AlipayLogonId"> <summary> 脱敏的支付宝账号 </summary> </member> <member name="P:FlexJobApi.Core.EnterpriseWallet.PrincipalId"> <summary> 签约主体标识。 当principal_type为CARD 时,该字段为支付宝用户号; </summary> </member> <member name="P:FlexJobApi.Core.EnterpriseWallet.PrincipalOpenId"> <summary> 签约主体标识。 当principal_type为CARD 时,该字段为支付宝用户号; </summary> </member> <member name="P:FlexJobApi.Core.EnterpriseWallet.ZmOpenId"> <summary> 用户的芝麻信用 openId,供商 户查询用户芝麻信用使用。 </summary> </member> <member name="P:FlexJobApi.Core.EnterpriseWallet.CreditAuthMode"> <summary> 授信模式,目前只在花芝代扣(即花芝go)协议时才会返回 </summary> </member> <member name="T:FlexJobApi.Core.Menu"> <summary> 菜单 @@ -3640,6 +3720,26 @@ <member name="F:FlexJobApi.Core.EnumEnterpriseWalletAccess.Alipay"> <summary> 支付宝 </summary> </member> <member name="T:FlexJobApi.Core.EnumEnterpriseWalletSignStatus"> <summary> 企业钱包签约状态 </summary> </member> <member name="F:FlexJobApi.Core.EnumEnterpriseWalletSignStatus.Apply"> <summary> 申请中 </summary> </member> <member name="F:FlexJobApi.Core.EnumEnterpriseWalletSignStatus.Normal"> <summary> 已签约 </summary> </member> <member name="F:FlexJobApi.Core.EnumEnterpriseWalletSignStatus.Stop"> <summary> 终止 </summary> </member> <member name="T:FlexJobApi.Core.EnumMenuType"> @@ -9467,19 +9567,14 @@ 转账场景说明 </summary> </member> <member name="P:FlexJobApi.Core.AlipayFundExpandindirectCreateCommand.SceneImageOssUrl"> <member name="P:FlexJobApi.Core.AlipayFundExpandindirectCreateCommand.SceneImage"> <summary> 转账场景截图 </summary> </member> <member name="P:FlexJobApi.Core.AlipayFundExpandindirectCreateCommand.SceneQualificationImageOssUrl"> <member name="P:FlexJobApi.Core.AlipayFundExpandindirectCreateCommand.SceneQualificationImage"> <summary> 商户行业资质图片 </summary> </member> <member name="P:FlexJobApi.Core.AlipayFundExpandindirectCreateCommand.SceneQualificationText"> <summary> 商户行业资质协议文本 商户行业资质图片或协议文本 </summary> </member> <member name="P:FlexJobApi.Core.AlipayFundExpandindirectCreateCommand.SitesInfo"> @@ -9595,6 +9690,41 @@ <member name="P:FlexJobApi.Core.AlipayFundExpandindirectOrderCancelCommand.Id"> <summary> 代进件单Id </summary> </member> <member name="T:FlexJobApi.Core.CloseEnterpriseWalletCommand"> <summary> 关闭企业钱包 </summary> </member> <member name="P:FlexJobApi.Core.CloseEnterpriseWalletCommand.Access"> <summary> 通道 </summary> </member> <member name="T:FlexJobApi.Core.GetAlipayNotifyCommand"> <summary> 支付宝通知回传 </summary> </member> <member name="T:FlexJobApi.Core.OpenEnterpriseWalletCommand"> <summary> 开通企业钱包 </summary> </member> <member name="P:FlexJobApi.Core.OpenEnterpriseWalletCommand.Access"> <summary> 通道 </summary> </member> <member name="T:FlexJobApi.Core.OpenEnterpriseWalletCommandResult"> <summary> 开通企业钱包 </summary> </member> <member name="P:FlexJobApi.Core.OpenEnterpriseWalletCommandResult.SignUrl"> <summary> 签约地址 </summary> </member> <member name="T:FlexJobApi.Core.GetAlipayFundExpandindirectOrderQuery"> @@ -9775,6 +9905,61 @@ <member name="P:FlexJobApi.Core.GetAlipayUserAgreementPageSignNotifyQuery.notify_type"> <summary> 用户签约成功通知类型 </summary> </member> <member name="T:FlexJobApi.Core.GetEnterpriseWalletQuery"> <summary> 查询企业钱包详情 </summary> </member> <member name="P:FlexJobApi.Core.GetEnterpriseWalletQuery.Access"> <summary> 通道 </summary> </member> <member name="T:FlexJobApi.Core.GetEnterpriseWalletQueryResult"> <summary> 查询企业钱包开通结果 </summary> </member> <member name="P:FlexJobApi.Core.GetEnterpriseWalletQueryResult.Id"> <summary> 钱包Id </summary> </member> <member name="P:FlexJobApi.Core.GetEnterpriseWalletQueryResult.Access"> <summary> 通道 </summary> </member> <member name="P:FlexJobApi.Core.GetEnterpriseWalletQueryResult.Code"> <summary> 协议号 </summary> </member> <member name="P:FlexJobApi.Core.GetEnterpriseWalletQueryResult.AgreementNo"> <summary> 通道协议号 </summary> </member> <member name="P:FlexJobApi.Core.GetEnterpriseWalletQueryResult.SignTime"> <summary> 协议签约时间 </summary> </member> <member name="P:FlexJobApi.Core.GetEnterpriseWalletQueryResult.ValidTime"> <summary> 协议生效时间 </summary> </member> <member name="P:FlexJobApi.Core.GetEnterpriseWalletQueryResult.InvalidTime"> <summary> 协议失效时间 </summary> </member> <member name="P:FlexJobApi.Core.GetEnterpriseWalletQueryResult.SignStatus"> <summary> 签约状态 </summary> </member> <member name="T:FlexJobApi.Core.DeleteMenuCommand"> @@ -12393,6 +12578,25 @@ 阿里支付工具 </summary> </member> <member name="M:FlexJobApi.Core.AlipayUtils.UserAgreementPageSign(Aop.Api.Domain.AlipayUserAgreementPageSignModel,System.String)"> <summary> 支付宝个人协议页面签约接口 </summary> <param name="model"></param> <param name="notifyUrl"></param> </member> <member name="M:FlexJobApi.Core.AlipayUtils.UserAgreementQuery(Aop.Api.Domain.AlipayUserAgreementQueryModel)"> <summary> 支付宝个人代扣协议查询接口 </summary> <param name="model"></param> </member> <member name="M:FlexJobApi.Core.AlipayUtils.UserAgreementUnsign(Aop.Api.Domain.AlipayUserAgreementUnsignModel)"> <summary> 支付宝个人代扣协议解约接口 </summary> <param name="model"></param> </member> <member name="M:FlexJobApi.Core.AlipayUtils.FundExpandindirectImageUpload(Aop.Api.Request.AlipayFundExpandindirectImageUploadRequest)"> <summary> 资金二级商户KYB代进件文件上传接口 FlexJobApi.Core/Models/UserServer/EnterpriseWallets/Commands/AlipayFundExpandindirectCreateCommand.cs
@@ -57,15 +57,11 @@ /// <summary> /// 转账场景截图 /// </summary> public string SceneImageOssUrl { get; set; } public string SceneImage { get; set; } /// <summary> /// 商户行业资质图片 /// 商户行业资质图片或协议文本 /// </summary> public string SceneQualificationImageOssUrl { get; set; } /// <summary> /// 商户行业资质协议文本 /// </summary> public string SceneQualificationText { get; set; } public string SceneQualificationImage { get; set; } /// <summary> /// 商户站点信息 /// </summary> FlexJobApi.Core/Models/UserServer/EnterpriseWallets/Commands/CloseEnterpriseWalletCommand.cs
New file @@ -0,0 +1,21 @@ using MediatR; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace FlexJobApi.Core { /// <summary> /// 关闭企业钱包 /// </summary> [Resource([EnumResourceController.UserServerEnterpriseWallet])] public class CloseEnterpriseWalletCommand : IRequest<Guid> { /// <summary> /// 通道 /// </summary> public EnumEnterpriseWalletAccess Access { get; set; } } } FlexJobApi.Core/Models/UserServer/EnterpriseWallets/Commands/GetAlipayNotifyCommand.cs
New file @@ -0,0 +1,17 @@ using MediatR; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace FlexJobApi.Core { /// <summary> /// 支付宝通知回传 /// </summary> [Resource([EnumResourceController.UserServerEnterpriseWallet], AllowAnonymous = true, IsFromForm = true)] public class GetAlipayNotifyCommand : IRequest<bool> { } } FlexJobApi.Core/Models/UserServer/EnterpriseWallets/Commands/OpenEnterpriseWalletCommand.cs
New file @@ -0,0 +1,33 @@ using MediatR; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace FlexJobApi.Core { /// <summary> /// 开通企业钱包 /// </summary> [Resource([EnumResourceController.UserServerEnterpriseWallet])] public class OpenEnterpriseWalletCommand : IRequest<OpenEnterpriseWalletCommandResult> { /// <summary> /// 通道 /// </summary> public EnumEnterpriseWalletAccess Access { get; set; } } /// <summary> /// 开通企业钱包 /// </summary> public class OpenEnterpriseWalletCommandResult { /// <summary> /// 签约地址 /// </summary> public string SignUrl { get; set; } } } FlexJobApi.Core/Models/UserServer/EnterpriseWallets/Queries/GetEnterpriseWalletQuery.cs
New file @@ -0,0 +1,69 @@ using Aop.Api.Domain; using MediatR; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Xml.Serialization; namespace FlexJobApi.Core { /// <summary> /// 查询企业钱包详情 /// </summary> [Resource([EnumResourceController.UserServerEnterpriseWallet])] public class GetEnterpriseWalletQuery : IRequest<GetEnterpriseWalletQueryResult> { /// <summary> /// 通道 /// </summary> public EnumEnterpriseWalletAccess Access { get; set; } } /// <summary> /// 查询企业钱包开通结果 /// </summary> public class GetEnterpriseWalletQueryResult { /// <summary> /// 钱包Id /// </summary> public Guid Id { get; set; } /// <summary> /// 通道 /// </summary> public EnumEnterpriseWalletAccess Access { get; set; } /// <summary> /// 协议号 /// </summary> public string Code { get; set; } /// <summary> /// 通道协议号 /// </summary> public string AgreementNo { get; set; } /// <summary> /// 协议签约时间 /// </summary> public DateTime? SignTime { get; set; } /// <summary> /// 协议生效时间 /// </summary> public DateTime? ValidTime { get; set; } /// <summary> /// 协议失效时间 /// </summary> public DateTime? InvalidTime { get; set; } /// <summary> /// 签约状态 /// </summary> public EnumEnterpriseWalletSignStatus SignStatus { get; set; } } } FlexJobApi.Core/Utils/AlipayUtils/AlipayOptions.cs
@@ -17,7 +17,7 @@ public string SignType { get; set; } public string AppCertPath { get; set; } public string AlipayPublicCertPath { get; set; } public string RootCertContent { get; set; } public string RootCertPath { get; set; } public string AlipayPublicKey { get; set; } public string NotifyUrl { get; set; } public string EncryptKey { get; set; } FlexJobApi.Core/Utils/AlipayUtils/AlipayUtils.cs
@@ -5,11 +5,14 @@ using Aop.Api.Request; using Aop.Api.Response; using Aop.Api.Util; using Furion; using Furion.FriendlyException; using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; @@ -23,11 +26,15 @@ { private readonly IAopClient alipayClient; private readonly ILogger<AlipayUtils> logger; private readonly IOptions<AlipayOptions> options; public AlipayUtils( ILogger<AlipayUtils> logger, IOptions<AlipayOptions> options) { var appCertPath = Path.Combine(App.WebHostEnvironment.ContentRootPath, options.Value.AppCertPath); var alipayPublicCertPath = Path.Combine(App.WebHostEnvironment.ContentRootPath, options.Value.AlipayPublicCertPath); var rootCertPath = Path.Combine(App.WebHostEnvironment.ContentRootPath, options.Value.RootCertPath); alipayClient = new DefaultAopClient(new AlipayConfig { ServerUrl = options.Value.ServerUrl, @@ -36,44 +43,62 @@ Format = options.Value.Format, Charset = options.Value.Charset, SignType = options.Value.SignType, AppCertPath = options.Value.AppCertPath, AlipayPublicCertPath = options.Value.AlipayPublicCertPath, RootCertContent = options.Value.RootCertContent, AppCertPath = appCertPath, AlipayPublicCertPath = alipayPublicCertPath, RootCertPath = rootCertPath, AlipayPublicKey = options.Value.AlipayPublicKey, EncryptKey = options.Value.EncryptKey, }); this.logger = logger; this.options = options; } public void UserAgreementPageSign(AlipayUserAgreementPageSignModel model) /// <summary> /// 支付宝个人协议页面签约接口 /// </summary> /// <param name="model"></param> /// <param name="notifyUrl"></param> public AlipayUserAgreementPageSignResponse UserAgreementPageSign(AlipayUserAgreementPageSignModel model, string notifyUrl = null) { // 初始化SDK // 构造请求参数以调用接口 logger.LogInformation($"正在执行支付宝个人协议页面签约接口:{model.ToJson()}"); AlipayUserAgreementPageSignRequest request = new AlipayUserAgreementPageSignRequest(); model.PersonalProductCode = "FUND_SAFT_SIGN_WITHHOLDING_P"; model.SignScene = "INDUSTRY|SATF_ACC"; model.ThirdPartyType = "PARTNER"; model.AccessParams = new AccessParams { Channel = "" }; // 设置签约有效时间限制 model.EffectTime = 300; request.SetBizModel(model); //request.SetNotifyUrl(); if (notifyUrl.IsNotNull()) { notifyUrl = $"{options.Value.NotifyUrl}{notifyUrl}"; request.SetNotifyUrl(notifyUrl); } AlipayUserAgreementPageSignResponse response = alipayClient.pageExecute(request, null, "GET"); string pageRedirectionData = response.Body; Console.WriteLine(pageRedirectionData); logger.LogInformation($"结果:{response.ToJson()}"); return response; } if (!response.IsError) { Console.WriteLine("调用成功"); } else { Console.WriteLine("调用失败"); } /// <summary> /// 支付宝个人代扣协议查询接口 /// </summary> /// <param name="model"></param> public AlipayUserAgreementQueryResponse UserAgreementQuery(AlipayUserAgreementQueryModel model) { logger.LogInformation($"正在执行支付宝个人代扣协议查询接口:{model.ToJson()}"); AlipayUserAgreementQueryRequest request = new AlipayUserAgreementQueryRequest(); request.SetBizModel(model); AlipayUserAgreementQueryResponse response = alipayClient.CertificateExecute(request); logger.LogInformation($"结果:{response.ToJson()}"); return response; } /// <summary> /// 支付宝个人代扣协议解约接口 /// </summary> /// <param name="model"></param> public AlipayUserAgreementUnsignResponse UserAgreementUnsign(AlipayUserAgreementUnsignModel model) { logger.LogInformation($"正在执行支付宝个人代扣协议解约接口:{model.ToJson()}"); AlipayUserAgreementUnsignRequest request = new AlipayUserAgreementUnsignRequest(); request.SetBizModel(model); AlipayUserAgreementUnsignResponse response = alipayClient.CertificateExecute(request); logger.LogInformation($"结果:{response.ToJson()}"); return response; } /// <summary> @@ -83,7 +108,7 @@ public AlipayFundExpandindirectImageUploadResponse FundExpandindirectImageUpload(AlipayFundExpandindirectImageUploadRequest request) { logger.LogInformation("正在执行资金二级商户KYB代进件文件上传接口"); AlipayFundExpandindirectImageUploadResponse response = alipayClient.Execute(request); AlipayFundExpandindirectImageUploadResponse response = alipayClient.CertificateExecute(request); logger.LogInformation($"结果:{response.ToJson()}"); return response; } @@ -101,9 +126,10 @@ request.SetBizModel(model); if (notifyUrl.IsNotNull()) { notifyUrl = $"{options.Value.NotifyUrl}{notifyUrl}"; request.SetNotifyUrl(notifyUrl); } AlipayFundExpandindirectCreateResponse response = alipayClient.Execute(request); AlipayFundExpandindirectCreateResponse response = alipayClient.CertificateExecute(request); logger.LogInformation($"结果:{response.ToJson()}"); return response; } @@ -118,7 +144,7 @@ logger.LogInformation($"正在执行资金二级商户KYB代进件单查询接口:{model.ToJson()}"); AlipayFundExpandindirectOrderQueryRequest request = new AlipayFundExpandindirectOrderQueryRequest(); request.SetBizModel(model); AlipayFundExpandindirectOrderQueryResponse response = alipayClient.Execute(request); AlipayFundExpandindirectOrderQueryResponse response = alipayClient.CertificateExecute(request); logger.LogInformation($"结果:{response.ToJson()}"); return response; } @@ -134,7 +160,7 @@ logger.LogInformation($"正在执行资金二级商户KYB代进件单取消接口:{model.ToJson()}"); AlipayFundExpandindirectOrderCancelRequest request = new AlipayFundExpandindirectOrderCancelRequest(); request.SetBizModel(model); AlipayFundExpandindirectOrderCancelResponse response = alipayClient.Execute(request); AlipayFundExpandindirectOrderCancelResponse response = alipayClient.CertificateExecute(request); logger.LogInformation($"结果:{response.ToJson()}"); return response; } FlexJobApi.UserServer.Application/EnterpriseWallets/Commands/AlipayFundExpandindirectCommandHandler.cs
@@ -20,7 +20,6 @@ /// 支付宝资金二级商户KYB代进件 /// </summary> public class AlipayFundExpandindirectCommandHandler( IOptions<AlipayOptions> options, AlipayUtils alipayUtils, IHttpRemoteService httpRemoteService, IRepository<AlipayFundExpandindirectOrder> rep @@ -30,7 +29,6 @@ IRequestHandler<AlipayFundExpandindirectOrderCancelCommand, Guid>, IRequestHandler<AlipayFundExpandindirectCreateNotifyCommand, Guid> { private readonly IOptions<AlipayOptions> options = options; private readonly AlipayUtils alipayUtils = alipayUtils; private readonly IHttpRemoteService httpRemoteService = httpRemoteService; private readonly IRepository<AlipayFundExpandindirectOrder> rep = rep; @@ -83,7 +81,7 @@ secondaryPartnerInfo.Name = entity.Name; secondaryPartnerInfo.IdentityType = entity.IdentityType; model.SecondaryPartnerInfo = secondaryPartnerInfo; var result = alipayUtils.FundExpandindirectCreate(model, $"{options.Value.NotifyUrl}/api/user/enterpriseWallet/alipayFundExpandindirectCreateNotify"); var result = alipayUtils.FundExpandindirectCreate(model, $"/api/user/enterpriseWallet/alipayFundExpandindirectCreateNotify"); if (result.IsError) { entity.RiskReviewRemark = result.Msg; @@ -115,7 +113,7 @@ { ProductCode = request.ProductCode, BizScene = request.BizScene, ImageType = Path.GetExtension(request.File.FileName), ImageType = Path.GetExtension(request.File.FileName).Trim('.').ToLower(), ImageContent = new Aop.Api.Util.FileItem(request.File.FileName, bytes) }); if (result.IsError) throw Oops.Oh(EnumErrorCodeType.s510, result.Msg); FlexJobApi.UserServer.Application/EnterpriseWallets/Commands/EnterpriseWalletCommandHandler.cs
New file @@ -0,0 +1,122 @@ using Aop.Api.Domain; using Azure; using FlexJobApi.Core; using Furion.DatabaseAccessor; using Furion.DistributedIDGenerator; using Furion.FriendlyException; using MediatR; using Microsoft.EntityFrameworkCore; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace FlexJobApi.UserServer.Application { /// <summary> /// 企业钱包命令处理器 /// </summary> public class EnterpriseWalletCommandHandler( IRepository<EnterpriseWallet> rep, IRepository<Enterprise> repEnterprise, AlipayUtils alipayUtils ) : IRequestHandler<OpenEnterpriseWalletCommand, OpenEnterpriseWalletCommandResult>, IRequestHandler<CloseEnterpriseWalletCommand, Guid> { private readonly IRepository<EnterpriseWallet> rep = rep; private readonly IRepository<Enterprise> repEnterprise = repEnterprise; private readonly AlipayUtils alipayUtils = alipayUtils; /// <summary> /// 开通企业钱包 /// </summary> /// <param name="request"></param> /// <param name="cancellationToken"></param> /// <returns></returns> public async Task<OpenEnterpriseWalletCommandResult> Handle(OpenEnterpriseWalletCommand request, CancellationToken cancellationToken) { var logier = JwtUtils.GetCurrentLogier(); var enterprise = await repEnterprise.AsQueryable().AsNoTracking() .Where(it => it.Id == logier.EnterpriseId) .FirstOrDefaultAsync(); if (enterprise == null) throw Oops.Oh(EnumErrorCodeType.s404, "企业"); if (!enterprise.IsReal) throw Oops.Oh(EnumErrorCodeType.s510, "请先实名"); var entity = await rep.AsQueryable() .Where(it => it.EnterpriseId == logier.EnterpriseId && it.Access == request.Access) .FirstOrDefaultAsync(); if (entity == null) { entity = new EnterpriseWallet(); entity.EnterpriseId = logier.EnterpriseId!.Value; entity.Access = EnumEnterpriseWalletAccess.Alipay; entity.PersonalProductCode = "FUND_SAFT_SIGN_WITHHOLDING_P"; entity.SignScene = "INDUSTRY|SATF_ACC"; entity.ThirdPartyType = "PARTNER"; entity.ProductCode = "FUND_SAFT_SIGN_WITHHOLDING"; entity.SignStatus = EnumEnterpriseWalletSignStatus.Apply; await SetCode(entity); await rep.InsertAsync(entity); } else { if (entity.SignStatus == EnumEnterpriseWalletSignStatus.Normal) throw Oops.Oh(EnumErrorCodeType.s510, "已签约"); entity.SignStatus = EnumEnterpriseWalletSignStatus.Apply; await rep.UpdateAsync(entity); } var model = new AlipayUserAgreementPageSignModel(); model.ExternalLogonId = enterprise.Id.ToString(); model.PersonalProductCode = entity.PersonalProductCode; model.SignScene = entity.SignScene; model.ExternalAgreementNo = entity.Code; model.ThirdPartyType = entity.ThirdPartyType; model.ProductCode = entity.ProductCode; model.AccessParams = new AccessParams { Channel = "QRCODE" }; var response = alipayUtils.UserAgreementPageSign(model, $"/api/user/enterpriseWallet/getAlipayUserAgreementPageSignNotify"); if (response.IsError) throw Oops.Oh(EnumErrorCodeType.s510, response.SubMsg ?? response.Msg); var result = new OpenEnterpriseWalletCommandResult(); result.SignUrl = response.PageRedirectionData; return result; } /// <summary> /// 关闭企业钱包 /// </summary> /// <param name="request"></param> /// <param name="cancellationToken"></param> /// <returns></returns> public async Task<Guid> Handle(CloseEnterpriseWalletCommand request, CancellationToken cancellationToken) { var logier = JwtUtils.GetCurrentLogier(); var entity = await rep.AsQueryable() .Where(it => it.EnterpriseId == logier.EnterpriseId && it.Access == request.Access) .FirstOrDefaultAsync(); if (entity == null) throw Oops.Oh(EnumErrorCodeType.s404, "企业钱包"); if (entity.SignStatus != EnumEnterpriseWalletSignStatus.Normal) throw Oops.Oh(EnumErrorCodeType.s510, "未签约"); var response = alipayUtils.UserAgreementUnsign(new AlipayUserAgreementUnsignModel { ExternalAgreementNo = entity.Code, PersonalProductCode = entity.PersonalProductCode, SignScene = entity.SignScene }); if (response.IsError) throw Oops.Oh(EnumErrorCodeType.s510, response.SubMsg ?? response.Msg); entity.SignStatus = EnumEnterpriseWalletSignStatus.Stop; return entity.Id; } private async Task SetCode(EnterpriseWallet entity) { entity.Code = $"{DateTime.Now:yyyyMMddHHmmss}{new Random(IDGen.NextID().GetHashCode()).Next(1000, 9999)}"; var exist = await rep.AsQueryable().AsNoTracking() .AnyAsync(it => it.Code == entity.Code); if (exist) { await SetCode(entity); } } } } FlexJobApi.UserServer.Application/EnterpriseWallets/Commands/GetAlipayNotifyCommandHandler.cs
New file @@ -0,0 +1,28 @@ using FlexJobApi.Core; using MediatR; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace FlexJobApi.UserServer.Application { /// <summary> /// 支付宝通知回传 /// </summary> public class GetAlipayNotifyCommandHandler : IRequestHandler<GetAlipayNotifyCommand, bool> { /// <summary> /// 支付宝通知回传 /// </summary> /// <param name="request"></param> /// <param name="cancellationToken"></param> /// <returns></returns> public Task<bool> Handle(GetAlipayNotifyCommand request, CancellationToken cancellationToken) { return Task.FromResult(true); } } } FlexJobApi.UserServer.Application/EnterpriseWallets/Queries/EnterpriseWalletQueryHandler.cs
New file @@ -0,0 +1,73 @@ using FlexJobApi.Core; using Furion.DatabaseAccessor; using Furion.FriendlyException; using Mapster; using MediatR; using Microsoft.EntityFrameworkCore; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace FlexJobApi.UserServer.Application { /// <summary> /// 企业钱包查询处理器 /// </summary> public class EnterpriseWalletQueryHandler( IRepository<EnterpriseWallet> rep, AlipayUtils alipayUtils ) : IRequestHandler<GetEnterpriseWalletQuery, GetEnterpriseWalletQueryResult> { private readonly IRepository<EnterpriseWallet> rep = rep; private readonly AlipayUtils alipayUtils = alipayUtils; /// <summary> /// 查询企业钱包详情 /// </summary> /// <param name="request"></param> /// <param name="cancellationToken"></param> /// <returns></returns> public async Task<GetEnterpriseWalletQueryResult> Handle(GetEnterpriseWalletQuery request, CancellationToken cancellationToken) { var logier = JwtUtils.GetCurrentLogier(); var entity = await rep.AsQueryable() .Where(it => it.EnterpriseId == logier.EnterpriseId && it.Access == request.Access) .FirstOrDefaultAsync(); if (entity == null) throw Oops.Oh(EnumErrorCodeType.s404, "企业钱包"); if (entity.SignStatus == EnumEnterpriseWalletSignStatus.Apply) { var response = alipayUtils.UserAgreementQuery(new Aop.Api.Domain.AlipayUserAgreementQueryModel { PersonalProductCode = entity.PersonalProductCode, SignScene = entity.SignScene, ExternalAgreementNo = entity.Code, ThirdPartyType = entity.ThirdPartyType, }); if (response.IsError) throw Oops.Oh(EnumErrorCodeType.s510, response.SubMsg ?? response.Msg); entity.AgreementNo = response.AgreementNo; entity.SignTime = response.SignTime.ToDateTime(); entity.ValidTime = response.ValidTime.ToDateTime(); entity.InvalidTime = response.InvalidTime.ToDateTime(); entity.SignStatus = response.Status == "TEMP" ? EnumEnterpriseWalletSignStatus.Apply : response.Status == "NORMAL" ? EnumEnterpriseWalletSignStatus.Normal : response.Status == "STOP" ? EnumEnterpriseWalletSignStatus.Stop : throw Oops.Oh(EnumErrorCodeType.s510, "状态异常"); entity.PricipalType = response.PricipalType; entity.AlipayLogonId = response.AlipayLogonId; entity.PrincipalId = response.PrincipalId; entity.PrincipalOpenId = response.PrincipalOpenId; entity.ZmOpenId = response.ZmOpenId; entity.CreditAuthMode = response.CreditAuthMode; await rep.UpdateAsync(entity); } var model = entity.Adapt<GetEnterpriseWalletQueryResult>(); return model; } } } FlexJobApi.UserServer.Application/FlexJobApi.UserServer.Application.xml
@@ -569,7 +569,7 @@ 支付宝资金二级商户KYB代进件 </summary> </member> <member name="M:FlexJobApi.UserServer.Application.AlipayFundExpandindirectCommandHandler.#ctor(Microsoft.Extensions.Options.IOptions{FlexJobApi.Core.AlipayOptions},FlexJobApi.Core.AlipayUtils,Furion.HttpRemote.IHttpRemoteService,Furion.DatabaseAccessor.IRepository{FlexJobApi.Core.AlipayFundExpandindirectOrder})"> <member name="M:FlexJobApi.UserServer.Application.AlipayFundExpandindirectCommandHandler.#ctor(FlexJobApi.Core.AlipayUtils,Furion.HttpRemote.IHttpRemoteService,Furion.DatabaseAccessor.IRepository{FlexJobApi.Core.AlipayFundExpandindirectOrder})"> <summary> 支付宝资金二级商户KYB代进件 </summary> @@ -607,6 +607,45 @@ <param name="cancellationToken"></param> <returns></returns> </member> <member name="T:FlexJobApi.UserServer.Application.EnterpriseWalletCommandHandler"> <summary> 企业钱包命令处理器 </summary> </member> <member name="M:FlexJobApi.UserServer.Application.EnterpriseWalletCommandHandler.#ctor(Furion.DatabaseAccessor.IRepository{FlexJobApi.Core.EnterpriseWallet},Furion.DatabaseAccessor.IRepository{FlexJobApi.Core.Enterprise},FlexJobApi.Core.AlipayUtils)"> <summary> 企业钱包命令处理器 </summary> </member> <member name="M:FlexJobApi.UserServer.Application.EnterpriseWalletCommandHandler.Handle(FlexJobApi.Core.OpenEnterpriseWalletCommand,System.Threading.CancellationToken)"> <summary> 开通企业钱包 </summary> <param name="request"></param> <param name="cancellationToken"></param> <returns></returns> </member> <member name="M:FlexJobApi.UserServer.Application.EnterpriseWalletCommandHandler.Handle(FlexJobApi.Core.CloseEnterpriseWalletCommand,System.Threading.CancellationToken)"> <summary> 关闭企业钱包 </summary> <param name="request"></param> <param name="cancellationToken"></param> <returns></returns> </member> <member name="T:FlexJobApi.UserServer.Application.GetAlipayNotifyCommandHandler"> <summary> 支付宝通知回传 </summary> </member> <member name="M:FlexJobApi.UserServer.Application.GetAlipayNotifyCommandHandler.Handle(FlexJobApi.Core.GetAlipayNotifyCommand,System.Threading.CancellationToken)"> <summary> 支付宝通知回传 </summary> <param name="request"></param> <param name="cancellationToken"></param> <returns></returns> </member> <member name="T:FlexJobApi.UserServer.Application.AlipayFundExpandindirectQueryHandler"> <summary> 查询支付宝资金二级商户KYB代进件单详情 @@ -638,6 +677,24 @@ <param name="cancellationToken"></param> <returns></returns> </member> <member name="T:FlexJobApi.UserServer.Application.EnterpriseWalletQueryHandler"> <summary> 企业钱包查询处理器 </summary> </member> <member name="M:FlexJobApi.UserServer.Application.EnterpriseWalletQueryHandler.#ctor(Furion.DatabaseAccessor.IRepository{FlexJobApi.Core.EnterpriseWallet},FlexJobApi.Core.AlipayUtils)"> <summary> 企业钱包查询处理器 </summary> </member> <member name="M:FlexJobApi.UserServer.Application.EnterpriseWalletQueryHandler.Handle(FlexJobApi.Core.GetEnterpriseWalletQuery,System.Threading.CancellationToken)"> <summary> 查询企业钱包详情 </summary> <param name="request"></param> <param name="cancellationToken"></param> <returns></returns> </member> <member name="F:FlexJobApi.UserServer.Application.EnumUserErrorCodeType.u1000"> <summary> 账号或密码不存在 FlexJobApi.Web.Entry/appsettings.json
@@ -56,7 +56,7 @@ "SignType": "RSA2", "AppCertPath": "AlipayCert/appCertPublicKey_2021004171602214.crt", "AlipayPublicCertPath": "AlipayCert/alipayCertPublicKey_RSA2.crt", "RootCertContent": "AlipayCert/alipayRootCert.crt", "RootCertPath": "AlipayCert/alipayRootCert.crt", "NotifyUrl": "https://testfj.81812333.com", "EncryptKey": "jjy8A7hB/1Bkhg+8FtXyyg==", "AlipayPublicKey": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAoDrOheetqHkE1RYaNhogP/iHVXEtGZW4A/JJnwpJs+6eLXfpXf/ecuywplDpgc/BXSUEnDaktUwceLXO8vdIf8h0y8yqWwYdgzC0xELYpTroK3dlNiShgVkUEeMXi+n3Mhjp9OVrqieggDI3YGzDBLY4UAWsXCcXnD+r/xIpT8keVMtb/LrUmL5XLvBVcn5MkJTAoeFt18EQXOLFN1+ldpaf9k+iyM2fbgXCc6InNSgHGSHZwhzm9t+cGqNd1ju/nQN9lHwKCDQPMn6cor2lsP1nsEfpHp2vdfNEdccVSRZB/kdtFzXEUpTFznz8+zK2D0Ra+B0G1nSxus9xsD3HmwIDAQAB"