sunpengfei
10 天以前 582011fe0778b89312a3a9f886a24d687530aad4
feat:开发
8个文件已添加
8个文件已修改
843 ■■■■■ 已修改文件
FlexJobApi.Core/Entities/UserServer/Enterprises/EnterpriseWallet.cs 72 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
FlexJobApi.Core/Enums/Users/EnumEnterpriseWalletSignStatus.cs 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
FlexJobApi.Core/FlexJobApi.Core.xml 220 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
FlexJobApi.Core/Models/UserServer/EnterpriseWallets/Commands/AlipayFundExpandindirectCreateCommand.cs 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
FlexJobApi.Core/Models/UserServer/EnterpriseWallets/Commands/CloseEnterpriseWalletCommand.cs 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
FlexJobApi.Core/Models/UserServer/EnterpriseWallets/Commands/GetAlipayNotifyCommand.cs 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
FlexJobApi.Core/Models/UserServer/EnterpriseWallets/Commands/OpenEnterpriseWalletCommand.cs 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
FlexJobApi.Core/Models/UserServer/EnterpriseWallets/Queries/GetEnterpriseWalletQuery.cs 69 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
FlexJobApi.Core/Utils/AlipayUtils/AlipayOptions.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
FlexJobApi.Core/Utils/AlipayUtils/AlipayUtils.cs 82 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
FlexJobApi.UserServer.Application/EnterpriseWallets/Commands/AlipayFundExpandindirectCommandHandler.cs 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
FlexJobApi.UserServer.Application/EnterpriseWallets/Commands/EnterpriseWalletCommandHandler.cs 122 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
FlexJobApi.UserServer.Application/EnterpriseWallets/Commands/GetAlipayNotifyCommandHandler.cs 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
FlexJobApi.UserServer.Application/EnterpriseWallets/Queries/EnterpriseWalletQueryHandler.cs 73 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
FlexJobApi.UserServer.Application/FlexJobApi.UserServer.Application.xml 59 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
FlexJobApi.Web.Entry/appsettings.json 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
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)
        /// <summary>
        /// 支付宝个人代扣协议查询接口
        /// </summary>
        /// <param name="model"></param>
        public AlipayUserAgreementQueryResponse UserAgreementQuery(AlipayUserAgreementQueryModel model)
            {
                Console.WriteLine("调用成功");
            logger.LogInformation($"正在执行支付宝个人代扣协议查询接口:{model.ToJson()}");
            AlipayUserAgreementQueryRequest request = new AlipayUserAgreementQueryRequest();
            request.SetBizModel(model);
            AlipayUserAgreementQueryResponse response = alipayClient.CertificateExecute(request);
            logger.LogInformation($"结果:{response.ToJson()}");
            return response;
            }
            else
        /// <summary>
        /// 支付宝个人代扣协议解约接口
        /// </summary>
        /// <param name="model"></param>
        public AlipayUserAgreementUnsignResponse UserAgreementUnsign(AlipayUserAgreementUnsignModel model)
            {
                Console.WriteLine("调用失败");
            }
            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"