Przeglądaj źródła

优化接口权限判断及其他

zuohuaijun 3 lat temu
rodzic
commit
58137579c1

+ 1 - 0
.gitignore

@@ -27,3 +27,4 @@ bin-release/
 /Admin.NET/Admin.NET.Web.Entry/wwwroot/Upload
 /App/MedicalPay/unpackage
 /Admin.NET/packages
+/Admin.NET/Admin.NET.Web.Entry/Properties/PublishProfiles/FolderProfile.pubxml.user

+ 1 - 1
Admin.NET/Admin.NET.Core/Admin.NET.Core.csproj

@@ -28,7 +28,7 @@
     <PackageReference Include="OnceMi.AspNetCore.OSS" Version="1.1.5" />
     <PackageReference Include="SKIT.FlurlHttpClient.Wechat.Api" Version="2.14.0" />
     <PackageReference Include="SKIT.FlurlHttpClient.Wechat.TenpayV3" Version="2.8.0" />
-    <PackageReference Include="SqlSugarCore" Version="5.0.7.9" />
+    <PackageReference Include="SqlSugarCore" Version="5.0.8.1" />
     <PackageReference Include="System.Linq.Dynamic.Core" Version="1.2.18" />
     <PackageReference Include="UAParser" Version="3.1.47" />
     <PackageReference Include="Yitter.IdGenerator" Version="1.0.12" />

+ 55 - 2
Admin.NET/Admin.NET.Core/Admin.NET.Core.xml

@@ -1357,6 +1357,7 @@
             微信商户号
             </summary>
         </member>
+        <!-- Badly formed XML comment ignored for member "P:Admin.NET.Core.WechatPay.AppId" -->
         <member name="P:Admin.NET.Core.WechatPay.OutTradeNumber">
             <summary>
             商户订单号
@@ -1402,6 +1403,11 @@
             支付完成时间
             </summary>
         </member>
+        <member name="P:Admin.NET.Core.WechatPay.ExpireTime">
+            <summary>
+            交易结束时间
+            </summary>
+        </member>
         <member name="P:Admin.NET.Core.WechatPay.Description">
             <summary>
             商品描述
@@ -1422,6 +1428,16 @@
             优惠标记
             </summary>
         </member>
+        <member name="P:Admin.NET.Core.WechatPay.Settlement">
+            <summary>
+            结算信息。
+            </summary>
+        </member>
+        <member name="P:Admin.NET.Core.WechatPay.NotifyUrl">
+            <summary>
+            回调通知地址
+            </summary>
+        </member>
         <member name="P:Admin.NET.Core.WechatPay.Remark">
             <summary>
             备注
@@ -1437,6 +1453,21 @@
             关联微信用户
             </summary>
         </member>
+        <member name="P:Admin.NET.Core.WechatPay.SubMerchantId">
+            <summary>
+            子商户号
+            </summary>
+        </member>
+        <member name="P:Admin.NET.Core.WechatPay.SubAppId">
+            <summary>
+            子商户AppId
+            </summary>
+        </member>
+        <member name="P:Admin.NET.Core.WechatPay.SubOpenId">
+            <summary>
+            子商户唯一标识
+            </summary>
+        </member>
         <member name="T:Admin.NET.Core.WechatUser">
             <summary>
             微信用户表
@@ -4505,6 +4536,17 @@
             </summary>
             <returns></returns>
         </member>
+        <member name="M:Admin.NET.Core.Service.SysMenuService.GetAllPermCodeList">
+            <summary>
+            获取所有按钮权限集合
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="M:Admin.NET.Core.Service.SysMenuService.DeleteMenuCache">
+            <summary>
+            清除菜单和按钮缓存
+            </summary>
+        </member>
         <member name="M:Admin.NET.Core.Service.SysMenuService.GetMenuIdList">
             <summary>
             获取当前用户菜单Id集合
@@ -5737,7 +5779,12 @@
         </member>
         <member name="M:Admin.NET.Core.Service.WeChatPayService.CreatePayTransaction(Admin.NET.Core.Service.WechatPayTransactionInput)">
             <summary>
-            微信支付统一下单获取Id
+            微信支付统一下单获取Id(商户直连)
+            </summary>
+        </member>
+        <member name="M:Admin.NET.Core.Service.WeChatPayService.CreatePayPartnerTransaction(Admin.NET.Core.Service.WechatPayTransactionInput)">
+            <summary>
+            微信支付统一下单获取Id(服务商模式)
             </summary>
         </member>
         <member name="M:Admin.NET.Core.Service.WeChatPayService.GetWeChatPayInfo(System.String)">
@@ -5749,7 +5796,13 @@
         </member>
         <member name="M:Admin.NET.Core.Service.WeChatPayService.WeChatPayCallBack">
             <summary>
-            微信支付成功回调(商户平台发来的通知内容)
+            微信支付成功回调(商户直连)
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="M:Admin.NET.Core.Service.WeChatPayService.WeChatPayPartnerCallBack">
+            <summary>
+            微信支付成功回调(服务商模式)
             </summary>
             <returns></returns>
         </member>

+ 38 - 0
Admin.NET/Admin.NET.Core/Entity/WechatPay.cs

@@ -17,6 +17,10 @@ namespace Admin.NET.Core
         public string MerchantId { get; set; }
 
         /// <summary>
+        /// 服务商AppId
+        public string AppId { get; set; }
+
+        /// <summary>
         /// 商户订单号
         /// </summary>
         [SugarColumn(ColumnDescription = "商户订单号")]
@@ -71,6 +75,12 @@ namespace Admin.NET.Core
         public DateTimeOffset? SuccessTime { get; set; }
 
         /// <summary>
+        /// 交易结束时间
+        /// </summary>
+        [SugarColumn(ColumnDescription = "交易结束时间")]
+        public DateTimeOffset? ExpireTime { get; set; }
+
+        /// <summary>
         /// 商品描述
         /// </summary>
         [SugarColumn(ColumnDescription = "商品描述")]
@@ -95,6 +105,16 @@ namespace Admin.NET.Core
         public string GoodsTag { get; set; }
 
         /// <summary>
+        /// 结算信息。
+        /// </summary>
+        public string Settlement { get; set; }
+
+        /// <summary>
+        /// 回调通知地址
+        /// </summary>
+        public string NotifyUrl { get; set; }
+
+        /// <summary>
         /// 备注
         /// </summary>
         [SugarColumn(ColumnDescription = "备注")]
@@ -111,5 +131,23 @@ namespace Admin.NET.Core
         /// </summary>
         [SugarColumn(IsIgnore = true)]
         public WechatUser WechatUser { get; set; }
+
+        /// <summary>
+        /// 子商户号
+        /// </summary>
+        public string SubMerchantId { get; set; }
+
+        /// <summary>
+        /// 子商户AppId
+        /// </summary>
+        [Newtonsoft.Json.JsonProperty("sub_appid")]
+        [System.Text.Json.Serialization.JsonPropertyName("sub_appid")]
+        public string SubAppId { get; set; }
+
+        /// <summary>
+        /// 子商户唯一标识
+        /// </summary>
+        [SugarColumn(ColumnDescription = "子商户唯一标识")]
+        public string SubOpenId { get; set; }
     }
 }

+ 19 - 10
Admin.NET/Admin.NET.Core/Service/Menu/SysMenuService.cs

@@ -25,8 +25,7 @@ namespace Admin.NET.Core.Service
             IUserManager userManager,
             SysRoleMenuService sysRoleMenuService,
             SysUserRoleService sysUserRoleService,
-            ISysCacheService sysCacheService
-            )
+            ISysCacheService sysCacheService)
         {
             _sysMenuRep = sysMenuRep;
             _userManager = userManager;
@@ -104,8 +103,7 @@ namespace Admin.NET.Core.Service
             await _sysMenuRep.InsertAsync(menu);
 
             // 清除缓存
-            await _sysCacheService.DelByPatternAsync(CacheConst.KeyMenu);
-            await _sysCacheService.DelByPatternAsync(CacheConst.KeyPermission);
+            DeleteMenuCache();
         }
 
         /// <summary>
@@ -127,8 +125,7 @@ namespace Admin.NET.Core.Service
             await _sysMenuRep.AsUpdateable(menu).IgnoreColumns(true).ExecuteCommandAsync();
 
             // 清除缓存
-            await _sysCacheService.DelByPatternAsync(CacheConst.KeyMenu);
-            await _sysCacheService.DelByPatternAsync(CacheConst.KeyPermission);
+            DeleteMenuCache();
         }
 
         /// <summary>
@@ -149,8 +146,7 @@ namespace Admin.NET.Core.Service
             await _sysRoleMenuService.DeleteRoleMenuByMenuIdList(menuIdList);
 
             // 清除缓存
-            await _sysCacheService.DelByPatternAsync(CacheConst.KeyMenu);
-            await _sysCacheService.DelByPatternAsync(CacheConst.KeyPermission);
+            DeleteMenuCache();
         }
 
         /// <summary>
@@ -190,14 +186,14 @@ namespace Admin.NET.Core.Service
             {
                 if (_userManager.SuperAdmin)
                 {
-                    permissions= await _sysMenuRep.AsQueryable()
+                    permissions = await _sysMenuRep.AsQueryable()
                         .Where(u => u.Type == MenuTypeEnum.Btn)
                         .Select(u => u.Permission).ToListAsync();
                 }
                 else
                 {
                     var menuIdList = await GetMenuIdList();
-                    permissions= await _sysMenuRep.AsQueryable()
+                    permissions = await _sysMenuRep.AsQueryable()
                         .Where(u => u.Type == MenuTypeEnum.Btn)
                         .Where(u => menuIdList.Contains(u.Id))
                         .Select(u => u.Permission).ToListAsync();
@@ -207,6 +203,10 @@ namespace Admin.NET.Core.Service
             return permissions;
         }
 
+        /// <summary>
+        /// 获取所有按钮权限集合
+        /// </summary>
+        /// <returns></returns>
         [NonAction]
         public async Task<List<string>> GetAllPermCodeList()
         {
@@ -222,6 +222,15 @@ namespace Admin.NET.Core.Service
         }
 
         /// <summary>
+        /// 清除菜单和按钮缓存
+        /// </summary>
+        private async void DeleteMenuCache()
+        {
+            await _sysCacheService.DelByPatternAsync(CacheConst.KeyMenu);
+            await _sysCacheService.DelByPatternAsync(CacheConst.KeyPermission);
+        }
+
+        /// <summary>
         /// 获取当前用户菜单Id集合
         /// </summary>
         /// <returns></returns>

+ 2 - 1
Admin.NET/Admin.NET.Core/Service/Role/SysRoleMenuService.cs

@@ -13,7 +13,8 @@ namespace Admin.NET.Core.Service
         private readonly SqlSugarRepository<SysRoleMenu> _sysRoleMenuRep;
         private readonly ISysCacheService _sysCacheService;
 
-        public SysRoleMenuService(SqlSugarRepository<SysRoleMenu> sysRoleMenuRep, ISysCacheService sysCacheService)
+        public SysRoleMenuService(SqlSugarRepository<SysRoleMenu> sysRoleMenuRep,
+            ISysCacheService sysCacheService)
         {
             _sysRoleMenuRep = sysRoleMenuRep;
             _sysCacheService = sysCacheService;

+ 90 - 3
Admin.NET/Admin.NET.Core/Service/WeChat/WechatPayService.cs

@@ -67,7 +67,7 @@ namespace Admin.NET.Core.Service
         }
 
         /// <summary>
-        /// 微信支付统一下单获取Id
+        /// 微信支付统一下单获取Id(商户直连)
         /// </summary>
         [HttpPost("/weChatPay/payTransaction")]
         public async Task<dynamic> CreatePayTransaction([FromBody] WechatPayTransactionInput input)
@@ -108,6 +108,55 @@ namespace Admin.NET.Core.Service
             };
         }
 
+
+        /// <summary>
+        /// 微信支付统一下单获取Id(服务商模式)
+        /// </summary>
+        [HttpPost("/weChatPay/payPartnerTransaction")]
+        public async Task<dynamic> CreatePayPartnerTransaction([FromBody] WechatPayTransactionInput input)
+        {
+            var request = new CreatePayPartnerTransactionJsapiRequest()
+            {
+                OutTradeNumber = DateTimeOffset.Now.ToString("yyyyMMddHHmmssfff") + (new Random()).Next(100, 1000), // YitIdHelper.NextId(), // 订单号
+                AppId = _wechatPayOptions.AppId,
+                MerchantId = _wechatPayOptions.MerchantId,
+                SubAppId = _wechatPayOptions.AppId,
+                SubMerchantId = _wechatPayOptions.MerchantId,
+                Description = input.Description,
+                Attachment = input.Attachment,
+                GoodsTag = input.GoodsTag,
+                ExpireTime = DateTimeOffset.Now.AddMinutes(10),
+                NotifyUrl = _payCallBackOptions.WechatPayUrl,
+                Amount = new CreatePayPartnerTransactionJsapiRequest.Types.Amount() { Total = input.Total },
+                Payer = new CreatePayPartnerTransactionJsapiRequest.Types.Payer() { OpenId = input.OpenId }
+            };
+            var response = await _wechatTenpayClient.ExecuteCreatePayPartnerTransactionJsapiAsync(request);
+            if (!response.IsSuccessful())
+                throw Oops.Oh(response.ErrorMessage);
+
+            // 保存订单信息
+            var wechatPay = new WechatPay()
+            {
+                AppId = _wechatPayOptions.AppId,
+                MerchantId = _wechatPayOptions.MerchantId,
+                SubAppId = _wechatPayOptions.AppId,
+                SubMerchantId = _wechatPayOptions.MerchantId,
+                OutTradeNumber = request.OutTradeNumber,
+                Description = input.Description,
+                Attachment = input.Attachment,
+                GoodsTag = input.GoodsTag,
+                Total = input.Total,
+                OpenId = input.OpenId
+            };
+            await _wechatPayUserRep.InsertAsync(wechatPay);
+
+            return new
+            {
+                response.PrepayId,
+                request.OutTradeNumber
+            };
+        }
+
         /// <summary>
         /// 获取支付订单详情
         /// </summary>
@@ -120,10 +169,10 @@ namespace Admin.NET.Core.Service
         }
 
         /// <summary>
-        /// 微信支付成功回调(商户平台发来的通知内容)
+        /// 微信支付成功回调(商户直连)
         /// </summary>
         /// <returns></returns>
-        [HttpPost("/notify/weChatPay/unifiedorder")]
+        [HttpPost("/notify/weChatPay/payCallBack")]
         [AllowAnonymous]
         public async Task WeChatPayCallBack()
         {
@@ -156,5 +205,43 @@ namespace Admin.NET.Core.Service
                 await _wechatPayUserRep.AsUpdateable(wechatPay).IgnoreColumns(true).ExecuteCommandAsync();
             }
         }
+
+        /// <summary>
+        /// 微信支付成功回调(服务商模式)
+        /// </summary>
+        /// <returns></returns>
+        [HttpPost("/notify/weChatPay/payPartnerCallback")]
+        [AllowAnonymous]
+        public async Task WeChatPayPartnerCallBack()
+        {
+            using var ms = new MemoryStream();
+            await App.HttpContext.Request.Body.CopyToAsync(ms);
+            var b = ms.ToArray();
+            var callbackJson = Encoding.UTF8.GetString(b);
+
+            var callbackModel = _wechatTenpayClient.DeserializeEvent(callbackJson);
+            if ("TRANSACTION.SUCCESS".Equals(callbackModel.EventType))
+            {
+                var callbackResource = _wechatTenpayClient.DecryptEventResource<PartnerTransactionResource>(callbackModel);
+
+                // 修改订单支付状态
+                var wechatPay = await _wechatPayUserRep.GetFirstAsync(u => u.OutTradeNumber == callbackResource.OutTradeNumber
+                    && u.MerchantId == callbackResource.MerchantId);
+                if (wechatPay == null) return;
+                //wechatPay.OpenId = callbackResource.Payer.OpenId; // 支付者标识
+                //wechatPay.MerchantId = callbackResource.MerchantId; // 微信商户号
+                //wechatPay.OutTradeNumber = callbackResource.OutTradeNumber; // 商户订单号
+                wechatPay.TransactionId = callbackResource.TransactionId; // 支付订单号
+                wechatPay.TradeType = callbackResource.TradeType; // 交易类型
+                wechatPay.TradeState = callbackResource.TradeState; // 交易状态
+                wechatPay.TradeStateDescription = callbackResource.TradeStateDescription; // 交易状态描述
+                wechatPay.BankType = callbackResource.BankType; // 付款银行类型
+                wechatPay.Total = callbackResource.Amount.Total; // 订单总金额
+                wechatPay.PayerTotal = callbackResource.Amount.PayerTotal; // 用户支付金额
+                wechatPay.SuccessTime = callbackResource.SuccessTime; // 支付完成时间
+
+                await _wechatPayUserRep.AsUpdateable(wechatPay).IgnoreColumns(true).ExecuteCommandAsync();
+            }
+        }
     }
 }

+ 7 - 13
Admin.NET/Admin.NET.Web.Core/Handlers/JwtHandler.cs

@@ -49,24 +49,19 @@ namespace Admin.NET.Web.Core
         private static async Task<bool> CheckAuthorzieAsync(DefaultHttpContext httpContext)
         {
             // 管理员跳过判断
-            if (App.User.FindFirst(ClaimConst.SuperAdmin)?.Value == ((int)UserTypeEnum.SuperAdmin).ToString()) return true;
+            if (App.User.FindFirst(ClaimConst.SuperAdmin)?.Value == ((int)UserTypeEnum.SuperAdmin).ToString())
+                return true;
 
             // 路由名称
-            var routeName = "";
+            var routeName = httpContext.Request.Path.Value[1..].Replace("/", ":");
             if (httpContext.Request.Path.StartsWithSegments("/api"))
-            {
                 routeName = httpContext.Request.Path.Value[5..].Replace("/", ":");
-            }
-            else
-            {
-                routeName = httpContext.Request.Path.Value[1..].Replace("/", ":");
-            }
 
-            // 默认路由(获取登录用户信息)
+            // 默认路由
             var defalutRoute = new List<string>()
             {
-                "getLoginUser",     //登录
-                "sysMenu:change"    //切换顶部菜单
+                "getLoginUser",     // 系统登录接口
+                "sysMenu:change"    // 菜单切换接口
             };
 
             if (defalutRoute.Contains(routeName)) return true;
@@ -75,8 +70,7 @@ namespace Admin.NET.Web.Core
             var permissionList = await App.GetService<SysMenuService>().GetPermCodeList();
             var allPermissionList = await App.GetService<SysMenuService>().GetAllPermCodeList();
 
-            // 检查授权
-            // 菜单中没有配置按钮权限,则不限制
+            // 检查授权(菜单中没有配置按钮权限,则不限制)            
             return permissionList.Exists(p => p.Equals(routeName, System.StringComparison.CurrentCultureIgnoreCase))
                 || allPermissionList.TrueForAll(p => !p.Equals(routeName, System.StringComparison.CurrentCultureIgnoreCase));
         }

Plik diff jest za duży
+ 0 - 7
Admin.NET/Admin.NET.Web.Entry/Properties/PublishProfiles/FolderProfile.pubxml.user


Niektóre pliki nie zostały wyświetlone z powodu dużej ilości zmienionych plików