core 框架代码整理优化

master
xiaochanghai 5 months ago
parent ff477576ef
commit f4721de044
  1. 482
      Tiobon.Core.Api/Tiobon.Core.Model.xml
  2. 9
      Tiobon.Core.Api/appsettings.json
  3. 277
      Tiobon.Core.Common/Attribute/FromFilterAttribute.cs
  4. 57
      Tiobon.Core.Common/Attribute/QueryFilter.cs
  5. 527
      Tiobon.Core.Common/Helper/CCBPayUtil.cs
  6. 37
      Tiobon.Core.Common/Static/StaticPayInfo.cs
  7. 1
      Tiobon.Core.Common/Tiobon.Core.Common.csproj
  8. 2
      Tiobon.Core.Extensions/ServiceExtensions/SwaggerSetup.cs
  9. 14
      Tiobon.Core.IServices/IAccessTrendLogServices.cs
  10. 42
      Tiobon.Core.IServices/IPayServices.cs
  11. 3
      Tiobon.Core.Jobs/TaskCenter.cs
  12. 21
      Tiobon.Core.Jobs/appsettings.json
  13. 30
      Tiobon.Core.Model/CustomEnums/AuthorityScopeEnum.cs
  14. 27
      Tiobon.Core.Model/Models/AccessTrendLog.cs
  15. 4
      Tiobon.Core.Model/PaginationModel.cs
  16. 23
      Tiobon.Core.Model/ResponseEnum.cs
  17. 27
      Tiobon.Core.Model/TableModel.cs
  18. 102
      Tiobon.Core.Model/ViewModels/PayModel.cs
  19. 34
      Tiobon.Core.Model/ViewModels/PayNeedModel.cs
  20. 21
      Tiobon.Core.Model/ViewModels/PayRefundNeedModel.cs
  21. 37
      Tiobon.Core.Model/ViewModels/PayRefundReturnModel.cs
  22. 30
      Tiobon.Core.Model/ViewModels/PayRefundReturnOrderInfoModel.cs
  23. 45
      Tiobon.Core.Model/ViewModels/PayRefundReturnResultModel.cs
  24. 53
      Tiobon.Core.Model/ViewModels/PayResultModel.cs
  25. 39
      Tiobon.Core.Model/ViewModels/PayReturnResultModel.cs
  26. 12
      Tiobon.Core.Services/AccessTrendLogServices.cs
  27. 16
      Tiobon.Core.Services/BASE/BaseServices.cs
  28. 6
      Tiobon.Core.Services/CommonServices.cs
  29. 400
      Tiobon.Core.Services/PayServices.cs
  30. 8
      Tiobon.Core.Services/ReportServices.cs
  31. 56
      Tiobon.Core.Tasks/HostedService/Job1TimedService.cs
  32. 43
      Tiobon.Core.Tasks/HostedService/Job2TimedService.cs
  33. 140
      Tiobon.Core.Tasks/QuartzNet/Jobs/Job_AccessTrendLog_Quartz.cs

@ -13812,26 +13812,6 @@
Ghrz_Shihua_OA_Employment (Dto.InsertInput)
</summary>
</member>
<member name="T:Tiobon.Core.Model.Models.AccessTrendLog">
<summary>
用户访问趋势日志
</summary>
</member>
<member name="P:Tiobon.Core.Model.Models.AccessTrendLog.UserInfo">
<summary>
用户
</summary>
</member>
<member name="P:Tiobon.Core.Model.Models.AccessTrendLog.Count">
<summary>
次数
</summary>
</member>
<member name="P:Tiobon.Core.Model.Models.AccessTrendLog.UpdateTime">
<summary>
更新时间
</summary>
</member>
<member name="T:Tiobon.Core.Model.Models.TiobonArticle">
<summary>
博客文章
@ -30192,36 +30172,6 @@
已逾期
</summary>
</member>
<member name="F:Tiobon.Core.Model.AuthorityScopeEnum.NONE">
<summary>
无任何权限
</summary>
</member>
<member name="F:Tiobon.Core.Model.AuthorityScopeEnum.Custom">
<summary>
自定义权限
</summary>
</member>
<member name="F:Tiobon.Core.Model.AuthorityScopeEnum.MyDepart">
<summary>
本部门
</summary>
</member>
<member name="F:Tiobon.Core.Model.AuthorityScopeEnum.MyDepartAndDown">
<summary>
本部门及以下
</summary>
</member>
<member name="F:Tiobon.Core.Model.AuthorityScopeEnum.OnlySelf">
<summary>
仅自己
</summary>
</member>
<member name="F:Tiobon.Core.Model.AuthorityScopeEnum.ALL">
<summary>
所有
</summary>
</member>
<member name="P:Tiobon.Core.Model.EntityAttribute.TableName">
<summary>
真实表名(数据库表名,若没有填写默认实体为表名)
@ -30432,8 +30382,8 @@
<member name="T:Tiobon.Core.Model.PaginationModel">
<summary>
所需分页参数
作者:胡丁文
时间:2020-4-3 20:31:26
作者:SimonHsiao
时间:2024-5-3 20:31:26
</summary>
</member>
<member name="P:Tiobon.Core.Model.PaginationModel.PageIndex">
@ -30456,21 +30406,6 @@
查询条件( 例如:id = 1 and name = 小明)
</summary>
</member>
<member name="F:Tiobon.Core.Model.ResponseEnum.NoPermissions">
<summary>
无权限
</summary>
</member>
<member name="F:Tiobon.Core.Model.ResponseEnum.NoFound">
<summary>
找不到指定资源
</summary>
</member>
<member name="F:Tiobon.Core.Model.ResponseEnum.ServerError">
<summary>
找不到指定资源
</summary>
</member>
<member name="T:Tiobon.Core.Model.ServiceResult`1">
<summary>
服务层响应实体(泛型)
@ -30605,31 +30540,6 @@
数据库读取类型
</summary>
</member>
<member name="T:Tiobon.Core.Model.TableModel`1">
<summary>
表格数据,支持分页
</summary>
</member>
<member name="P:Tiobon.Core.Model.TableModel`1.Code">
<summary>
返回编码
</summary>
</member>
<member name="P:Tiobon.Core.Model.TableModel`1.Msg">
<summary>
返回信息
</summary>
</member>
<member name="P:Tiobon.Core.Model.TableModel`1.Count">
<summary>
记录总数
</summary>
</member>
<member name="P:Tiobon.Core.Model.TableModel`1.Data">
<summary>
返回数据集
</summary>
</member>
<member name="T:Tiobon.Core.Model.Tenants.ITenantEntity">
<summary>
租户模型接口
@ -31052,394 +30962,6 @@
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayModel.MERCHANTID">
<summary>
商户号
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayModel.POSID">
<summary>
柜台号
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayModel.BRANCHID">
<summary>
分行号
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayModel.GROUPMCH">
<summary>
集团商户信息
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayModel.TXCODE">
<summary>
交易码
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayModel.MERFLAG">
<summary>
商户类型
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayModel.TERMNO1">
<summary>
终端编号 1
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayModel.TERMNO2">
<summary>
终端编号 2
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayModel.ORDERID">
<summary>
订单号
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayModel.QRCODE">
<summary>
码信息(一维码、二维码)
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayModel.AMOUNT">
<summary>
订单金额,单位:元
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayModel.PROINFO">
<summary>
商品名称
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayModel.REMARK1">
<summary>
备注 1
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayModel.REMARK2">
<summary>
备注 2
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayModel.FZINFO1">
<summary>
分账信息一
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayModel.FZINFO2">
<summary>
分账信息二
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayModel.SUB_APPID">
<summary>
子商户公众账号 ID
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayModel.RETURN_FIELD">
<summary>
返回信息位图
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayModel.USERPARAM">
<summary>
实名支付
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayModel.detail">
<summary>
商品详情
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayModel.goods_tag">
<summary>
订单优惠标记
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayModel.pubKey">
<summary>
公钥
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayModel.url">
<summary>
请求地址
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayModel.deleteEmpty">
<summary>
是否删除空值
</summary>
</member>
<member name="T:Tiobon.Core.Model.ViewModels.PayNeedModel">
<summary>
退款参数
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayNeedModel.ORDERID">
<summary>
订单ID
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayNeedModel.PROINFO">
<summary>
商品名称
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayNeedModel.AMOUNT">
<summary>
支付金额(小数点最多两位)
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayNeedModel.QRCODE">
<summary>
二维码/条码信息
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayNeedModel.REMARK1">
<summary>
备注信息1
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayNeedModel.REMARK2">
<summary>
备注信息2
</summary>
</member>
<member name="T:Tiobon.Core.Model.ViewModels.PayRefundNeedModel">
<summary>
订单参数
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayRefundNeedModel.ORDER">
<summary>
订单号
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayRefundNeedModel.MONEY">
<summary>
退款金额
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayRefundNeedModel.REFUND_CODE">
<summary>
退款流水号(可选)
</summary>
</member>
<member name="T:Tiobon.Core.Model.ViewModels.PayRefundReturnModel">
<summary>
退款返回消息
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayRefundReturnModel.REQUEST_SN">
<summary>
序列号
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayRefundReturnModel.CUST_ID">
<summary>
商户号
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayRefundReturnModel.TX_CODE">
<summary>
交易码
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayRefundReturnModel.RETURN_CODE">
<summary>
返回码
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayRefundReturnModel.RETURN_MSG">
<summary>
返回码说明
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayRefundReturnModel.LANGUAGE">
<summary>
语言
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayRefundReturnModel.TX_INFO">
<summary>
订单信息
</summary>
</member>
<member name="T:Tiobon.Core.Model.ViewModels.PayRefundReturnOrderInfoModel">
<summary>
订单信息
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayRefundReturnOrderInfoModel.ORDER_NUM">
<summary>
订单号
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayRefundReturnOrderInfoModel.PAY_AMOUNT">
<summary>
支付金额
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayRefundReturnOrderInfoModel.AMOUNT">
<summary>
退款金额
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayRefundReturnOrderInfoModel.REM1">
<summary>
备注1
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayRefundReturnOrderInfoModel.REM2">
<summary>
备注2
</summary>
</member>
<member name="T:Tiobon.Core.Model.ViewModels.PayRefundReturnResultModel">
<summary>
退款返回结果消息
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayRefundReturnResultModel.ORDER_NUM">
<summary>
订单号
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayRefundReturnResultModel.PAY_AMOUNT">
<summary>
支付金额
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayRefundReturnResultModel.AMOUNT">
<summary>
退款金额
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayRefundReturnResultModel.REQUEST_SN">
<summary>
序列号
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayRefundReturnResultModel.CUST_ID">
<summary>
商户号
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayRefundReturnResultModel.TX_CODE">
<summary>
交易码
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayRefundReturnResultModel.RETURN_CODE">
<summary>
返回码
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayRefundReturnResultModel.RETURN_MSG">
<summary>
返回码说明
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayRefundReturnResultModel.LANGUAGE">
<summary>
语言
</summary>
</member>
<member name="T:Tiobon.Core.Model.ViewModels.PayResultModel">
<summary>
支付结果dto
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayResultModel.RESULT">
<summary>
支付结果
Y:成功
N:失败
U:不确定
Q:待轮询
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayResultModel.ORDERID">
<summary>
订单ID
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayResultModel.AMOUNT">
<summary>
支付金额
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayResultModel.QRCODETYPE">
<summary>
二维码类型
1:龙支付
2:微信
3:支付宝
4:银联
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayResultModel.WAITTIME">
<summary>
等待时间-轮询等待时间
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayResultModel.TRACEID">
<summary>
全局事件跟踪号-建行交易流水号
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayResultModel.ERRCODE">
<summary>
错误码
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayResultModel.ERRMSG">
<summary>
错误信息
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayResultModel.SIGN">
<summary>
验证签名-防止伪造攻击
</summary>
</member>
<member name="T:Tiobon.Core.Model.ViewModels.PayReturnResultModel">
<summary>
返回支付结果
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayReturnResultModel.ORDERID">
<summary>
发起的订单ID
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayReturnResultModel.AMOUNT">
<summary>
返回支付的金额
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayReturnResultModel.QRCODETYPE">
<summary>
返回支付的类型 1:龙支付 2:微信 3:支付宝 4:银联
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayReturnResultModel.TRACEID">
<summary>
返回建行的流水号
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayReturnResultModel.ERRCODE">
<summary>
错误代码
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayReturnResultModel.ERRMSG">
<summary>
错误信息
</summary>
</member>
<member name="T:Tiobon.Core.Model.ViewModels.QuartzReflectionViewModel">
<summary>
实现IJob的类

@ -337,15 +337,6 @@
"ServiceHealthCheck": "/healthcheck",
"ConsulAddress": "http://localhost:8500"
},
"PayInfo": { //
"MERCHANTID": "", //
"POSID": "", //
"BRANCHID": "", //
"pubKey": "", //
"USER_ID": "", //
"PASSWORD": "", //
"OutAddress": "http://127.0.0.1:12345" //
},
"nacos": {
"ServerAddresses": [ "http://localhost:8848" ], // nacos
"DefaultTimeOut": 15000, //

@ -1,277 +0,0 @@
using Microsoft.AspNetCore.Mvc.ModelBinding;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
namespace Tiobon.Core.Common
{
public class FilterHeaderBinder : IModelBinder
{
public Task BindModelAsync(ModelBindingContext bindingContext)
{
if (bindingContext == null)
{
throw new ArgumentNullException(nameof(bindingContext));
}
var name = bindingContext.FieldName;
var headers = bindingContext.HttpContext.Request.Headers;
QueryFilter queryFilter;
if (!headers.ContainsKey(name))
{
queryFilter = QueryFilter.Default;
bindingContext.Result = ModelBindingResult.Success(queryFilter);
return Task.CompletedTask;
}
string filter = headers[name];
if (bindingContext.ModelType == typeof(string))
{
bindingContext.Result = ModelBindingResult.Success(filter);
return Task.CompletedTask;
}
try
{
if (string.IsNullOrEmpty(filter) || filter == "%22%22" || filter.ToLower() == "%7b%7d")
{
queryFilter = QueryFilter.Default;
}
else if (filter.Trim() == "undefined" || filter.Trim() == "null")
{
queryFilter = QueryFilter.Default;
//LoggerHelper.SendLogError($"QueryFilter 反序列化异常: {filter}\r\n请求地址: {bindingContext.HttpContext.Request.GetEncodedUrl()}");
}
else
{
queryFilter = JsonConvert.DeserializeObject<QueryFilter>(System.Web.HttpUtility.UrlDecode(filter));
SetPredicateValues(queryFilter, bindingContext);
}
bindingContext.Result = ModelBindingResult.Success(queryFilter ?? QueryFilter.Default);
}
catch
{
//LoggerHelper.SendLogError($"QueryFilter 反序列化失败: {filter}\r\n请求地址: {bindingContext.HttpContext.Request.GetEncodedUrl()}");
bindingContext.Result = ModelBindingResult.Success(QueryFilter.Default);
}
return Task.CompletedTask;
}
/// <summary>
/// 设置 PredicateValues 的值类型
/// </summary>
/// <param name="queryFilter"></param>
/// <param name="bindingContext"></param>
private static void SetPredicateValues(QueryFilter queryFilter, ModelBindingContext bindingContext)
{
//if (queryFilter?.PredicateValues == null || queryFilter.PredicateValues.Length == 0)
//{
// return;
//}
//for (int i = 0; i < queryFilter.PredicateValues.Length; i++)
//{
// if (queryFilter.PredicateValues[i] is JObject jObj)
// {
// var prop = jObj.Properties()?.FirstOrDefault();
// if (prop == null)
// continue;
// var type = StringConvertToType(prop.Name);
// if (type == null)
// continue;
// try
// {
// var v = JsonConvert.DeserializeObject(prop.Value?.ToString(), type);
// if (v != null)
// {
// queryFilter.PredicateValues[i] = v;
// }
// }
// catch (Exception)
// {
// throw;
// //LoggerHelper.SendLogError($"QueryFilter.PredicateValues[{i}] [{queryFilter.PredicateValues[i]}] 反序列化失败\r\n" +
// // $"请求地址: {bindingContext.HttpContext.Request.GetEncodedUrl()}\r\n" +
// // $"错误信息: {ex}");
// }
// }
//}
}
#region 字符串获取类型
/// <summary>
/// 根据 <paramref name="name"/> 获取 <see cref="Type"/> 类型
/// </summary>
/// <param name="name"></param>
/// <returns></returns>
public static Type StringConvertToType(string name)
{
if (string.IsNullOrEmpty(name))
{
return default;
}
switch (name.Trim().ToUpper())
{
case "INT":
case "INT32":
return typeof(int);
case "INT?":
case "INT32?":
return typeof(int?);
case "INT[]":
case "INT32[]":
return typeof(int[]);
case "INT?[]":
case "INT32?[]":
return typeof(int?[]);
case "LIST<INT>":
case "LIST<INT32>":
return typeof(List<int>);
case "LIST<INT?>":
case "LIST<INT32?>":
return typeof(List<int?>);
case "LONG":
case "INT64":
return typeof(long);
case "LONG?":
case "INT64?":
return typeof(long?);
case "LONG[]":
case "INT64[]":
return typeof(long[]);
case "LONG?[]":
case "INT64?[]":
return typeof(long?[]);
case "LIST<LONG>":
case "LIST<INT64>":
return typeof(List<long>);
case "LIST<LONG?>":
case "LIST<INT64?>":
return typeof(List<long?>);
case "FLOAT":
case "SINGLE":
return typeof(float);
case "FLOAT?":
case "SINGLE?":
return typeof(float?);
case "FLOAT[]":
case "SINGLE[]":
return typeof(float[]);
case "FLOAT?[]":
case "SINGLE?[]":
return typeof(float?[]);
case "LIST<FLOAT>":
case "LIST<SINGLE>":
return typeof(List<float>);
case "LIST<FLOAT?>":
case "LIST<SINGLE?>":
return typeof(List<float?>);
case "DOUBLE":
return typeof(double);
case "DOUBLE?":
return typeof(double?);
case "DOUBLE[]":
return typeof(double[]);
case "DOUBLE?[]":
return typeof(double?[]);
case "LIST<DOUBLE>":
return typeof(List<double>);
case "LIST<DOUBLE?>":
return typeof(List<double?>);
case "DECIMAL":
return typeof(decimal);
case "DECIMAL?":
return typeof(decimal?);
case "DECIMAL[]":
return typeof(decimal[]);
case "DECIMAL?[]":
return typeof(decimal?[]);
case "LIST<DECIMAL>":
return typeof(List<decimal>);
case "LIST<DECIMAL?>":
return typeof(List<decimal?>);
case "DATETIME":
return typeof(DateTime);
case "DATETIME?":
return typeof(DateTime?);
case "DATETIME[]":
return typeof(DateTime[]);
case "DATETIME?[]":
return typeof(DateTime?[]);
case "LIST<DATETIME>":
return typeof(List<DateTime>);
case "LIST<DATETIME?>":
return typeof(List<DateTime?>);
case "GUID":
return typeof(Guid);
case "GUID?":
return typeof(Guid?);
case "GUID[]":
return typeof(Guid[]);
case "GUID?[]":
return typeof(Guid?[]);
case "LIST<GUID>":
return typeof(List<Guid>);
case "LIST<GUID?>":
return typeof(List<Guid?>);
case "BOOL":
return typeof(bool);
case "BOOL?":
return typeof(bool?);
case "BOOL[]":
return typeof(bool[]);
case "BOOL?[]":
return typeof(bool?[]);
case "LIST<BOOL>":
return typeof(List<bool>);
case "LIST<BOOL?>":
return typeof(List<bool?>);
case "STRING":
return typeof(string);
case "STRING[]":
return typeof(string[]);
case "LIST<STRING>":
return typeof(List<string>);
default:
break;
}
return Type.GetType(name);
}
#endregion
}
/// <summary>
/// 从 Header 自动反序列化 QueryFilter 并绑定
/// </summary>
[AttributeUsage(AttributeTargets.Property | AttributeTargets.Parameter, AllowMultiple = false, Inherited = true)]
public class FromFilterAttribute : Attribute, IBindingSourceMetadata, IModelNameProvider, IBinderTypeProviderMetadata
{
public FromFilterAttribute()
{
}
public BindingSource BindingSource => BindingSource.Header;
public string Name { get; set; }
public Type BinderType => typeof(FilterHeaderBinder);
}
}

@ -4,63 +4,6 @@ using Tiobon.Core.Model;
namespace Tiobon.Core.Common;
/// <summary>
/// 动态查询条件
/// </summary>
public class QueryFilter
{
private int _pageIndex;
/// <summary>
/// 起始位置(e.g. 0)
/// </summary>
[Required]
public int PageIndex
{
get { return _pageIndex; }
set
{
//前端默认从分页显示默认1开始,所以后端需要-1
if (value >= 1)
value -= 1;
_pageIndex = value;
}
}
/// <summary>
/// 每页数量(e.g. 10)
/// </summary>
[Required]
public int PageSize { get; set; }
private string _conditions;
/// <summary>
/// 查询条件( 例如:id = 1 and name = 小明)
/// </summary>
public string Conditions
{
get { return _conditions; }
set
{
//前端默认从分页显示默认1开始,所以后端需要-1
if (value == "1=1")
value = null;
_conditions = value;
}
}
/// <summary>
/// 排序条件表达式(e.g. LoginName ASC,Name DESC)
/// </summary>
public string Sorting { get; set; }
/// <summary>
/// 缺省值
/// </summary>
public static QueryFilter Default => new QueryFilter
{
PageIndex = 1,
PageSize = 100000,
Sorting = string.Empty,
Conditions = string.Empty
};
}
/// <summary>
/// 动态查询条件

@ -1,527 +0,0 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.IO;
using System.Runtime.InteropServices;
using System.Security.Cryptography;
using System.Text;
using System.Web;
namespace Tiobon.Core.Common
{
/// <summary>
/// 建行支付助手(根据官方提供的dll反编译过来的)
/// </summary>
public class CCBPayUtil
{
// Token: 0x06000001 RID: 1 RVA: 0x00002050 File Offset: 0x00000250
public string makeCCBParam(string param, string pubkey)
{
string text = this.dicSort(param);
text += this.MD5KEY;
string str = new MessageDigest_MD5().Md5_32(text);
param = param + "&SIGN=" + str;
if (pubkey.Length >= 30)
{
pubkey = pubkey.Substring(pubkey.Length - 30);
}
if (pubkey.Length >= 8)
{
pubkey = pubkey.Substring(0, 8);
}
string text2 = new DES_ENCRY_DECRY().doEncrypt(param, pubkey);
text2 = text2.Replace("+", ",");
return HttpUtility.UrlEncode(text2, Encoding.GetEncoding("ISO-8859-1"));
}
// Token: 0x06000002 RID: 2 RVA: 0x00002104 File Offset: 0x00000304
public bool verifyNotifySign(string src, string sign, string pubKey)
{
return new RSASign().verifySigature(src, sign, pubKey);
}
// Token: 0x06000003 RID: 3 RVA: 0x00002124 File Offset: 0x00000324
private string dicSort(string param)
{
return this.GetSignContent(this.strToMap(param));
}
// Token: 0x06000004 RID: 4 RVA: 0x00002144 File Offset: 0x00000344
private IDictionary<string, string> strToMap(string param)
{
IDictionary<string, string> dictionary = new Dictionary<string, string>();
string[] array = param.Split(new char[]
{
'&'
});
for (int i = 0; i < array.Length; i++)
{
if (!"".Equals(array[i]))
{
string[] array2 = array[i].Split(new char[]
{
'='
});
if (array2.Length == 1)
{
dictionary.Add(array2[0], "");
}
else
{
dictionary.Add(array2[0], array2[1]);
}
}
}
return dictionary;
}
// Token: 0x06000005 RID: 5 RVA: 0x000021F0 File Offset: 0x000003F0
private string GetSignContent(IDictionary<string, string> parameters)
{
IDictionary<string, string> dictionary = new SortedDictionary<string, string>(parameters);
IEnumerator<KeyValuePair<string, string>> enumerator = dictionary.GetEnumerator();
StringBuilder stringBuilder = new StringBuilder("");
while (enumerator.MoveNext())
{
KeyValuePair<string, string> keyValuePair = enumerator.Current;
string key = keyValuePair.Key;
keyValuePair = enumerator.Current;
string value = keyValuePair.Value;
if (!string.IsNullOrEmpty(key) && !string.IsNullOrEmpty(value))
{
stringBuilder.Append(key).Append("=").Append(value).Append("&");
}
}
return stringBuilder.ToString().Substring(0, stringBuilder.Length - 1);
}
// Token: 0x04000001 RID: 1
//private string VERSION = "1.0.0";
// Token: 0x04000002 RID: 2
private string MD5KEY = "20120315201809041004";
}
internal class RSASign
{
// Token: 0x06000007 RID: 7 RVA: 0x000022C4 File Offset: 0x000004C4
protected internal bool verifySigature(string signContent, string sign, string pubKey)
{
byte[] inArray = this.hexStrToBytes(pubKey);
pubKey = Convert.ToBase64String(inArray);
string text = "-----BEGIN PUBLIC KEY-----\r\n";
text += pubKey;
text += "-----END PUBLIC KEY-----\r\n\r\n";
byte[] sign2 = this.hexStrToBytes(sign);
byte[] bytes = Encoding.GetEncoding(RSASign.DEFAULT_CHARSET).GetBytes(signContent);
return this.RSACheckContent(bytes, sign2, text, "MD5");
}
// Token: 0x06000008 RID: 8 RVA: 0x00002330 File Offset: 0x00000530
private bool RSACheckContent(byte[] signContent, byte[] sign, string publicKeyPem, string signType)
{
bool result;
try
{
RSACryptoServiceProvider rsacryptoServiceProvider = new RSACryptoServiceProvider();
rsacryptoServiceProvider.PersistKeyInCsp = false;
RSACryptoServiceProviderExtension.LoadPublicKeyPEM(rsacryptoServiceProvider, publicKeyPem);
bool flag = rsacryptoServiceProvider.VerifyData(signContent, signType, sign);
result = flag;
}
catch
{
result = false;
}
return result;
}
// Token: 0x06000009 RID: 9 RVA: 0x0000237C File Offset: 0x0000057C
private byte[] hexStrToBytes(string s)
{
s = s.Replace(" ", "");
if (s.Length % 2 != 0)
{
s += " ";
}
byte[] array = new byte[s.Length / 2];
for (int i = 0; i < array.Length; i++)
{
array[i] = Convert.ToByte(s.Substring(i * 2, 2), 16);
}
return array;
}
// Token: 0x04000003 RID: 3
private static string DEFAULT_CHARSET = "GBK";
}
public class DES_ENCRY_DECRY
{
protected internal string doEncrypt(string param, string pubkey)
{
this.tdesKey = ((pubkey.Length > 8) ? pubkey.Substring(0, 8) : pubkey);
byte[] bytes = this.DESEncrypt(this.UTF_16BE, param, this.ISO_8859_1, this.tdesKey);
return this.Base64Encode(bytes);
}
// Token: 0x0600001A RID: 26 RVA: 0x00002684 File Offset: 0x00000884
protected internal string doDecrypt(string param, string pubkey)
{
this.tdesKey = ((pubkey.Length > 8) ? pubkey.Substring(0, 8) : pubkey);
return this.DESDecrypt(this.UTF_16BE, param, this.ISO_8859_1, this.tdesKey);
}
// Token: 0x0600001B RID: 27 RVA: 0x000026CC File Offset: 0x000008CC
private byte[] DESEncrypt(string dataCharset, string data, string keyCharset, string key)
{
byte[] result;
try
{
byte[] bytes = Encoding.GetEncoding(keyCharset).GetBytes(key);
byte[] rgbIV = bytes;
byte[] bytes2 = Encoding.GetEncoding(dataCharset).GetBytes(data);
var descryptoServiceProvider = DES.Create();
descryptoServiceProvider.Mode = CipherMode.ECB;
descryptoServiceProvider.Padding = PaddingMode.PKCS7;
MemoryStream memoryStream = new MemoryStream();
CryptoStream cryptoStream = new CryptoStream(memoryStream, descryptoServiceProvider.CreateEncryptor(bytes, rgbIV), CryptoStreamMode.Write);
cryptoStream.Write(bytes2, 0, bytes2.Length);
cryptoStream.FlushFinalBlock();
result = memoryStream.ToArray();
}
catch
{
result = null;
}
return result;
}
// Token: 0x0600001C RID: 28 RVA: 0x00002764 File Offset: 0x00000964
private string DESDecrypt(string dataCharset, string data, string keyCoding, string key)
{
string result;
try
{
byte[] bytes = Encoding.GetEncoding(keyCoding).GetBytes(key);
byte[] rgbIV = bytes;
byte[] array = this.Base64Decode(data);
var descryptoServiceProvider = DES.Create();
descryptoServiceProvider.Mode = CipherMode.ECB;
descryptoServiceProvider.Padding = PaddingMode.PKCS7;
MemoryStream memoryStream = new MemoryStream();
CryptoStream cryptoStream = new CryptoStream(memoryStream, descryptoServiceProvider.CreateDecryptor(bytes, rgbIV), CryptoStreamMode.Write);
cryptoStream.Write(array, 0, array.Length);
cryptoStream.FlushFinalBlock();
result = Encoding.GetEncoding(dataCharset).GetString(memoryStream.ToArray());
}
catch
{
result = null;
}
return result;
}
// Token: 0x0600001D RID: 29 RVA: 0x00002800 File Offset: 0x00000A00
private string Base64Encode(byte[] bytes)
{
string result = string.Empty;
try
{
result = Convert.ToBase64String(bytes);
}
catch
{
}
return result;
}
// Token: 0x0600001E RID: 30 RVA: 0x0000283C File Offset: 0x00000A3C
private byte[] Base64Decode(string source)
{
byte[] result = null;
try
{
result = Convert.FromBase64String(source);
}
catch
{
}
return result;
}
// Token: 0x04000031 RID: 49
private string tdesKey = "12345678";
// Token: 0x04000032 RID: 50
private string UTF_16BE = "utf-16BE";
// Token: 0x04000033 RID: 51
private string ISO_8859_1 = "ISO-8859-1";
}
internal class MessageDigest_MD5
{
// Token: 0x06000020 RID: 32 RVA: 0x000028A0 File Offset: 0x00000AA0
protected internal string Md5_32(string src)
{
var md = MD5.Create();
byte[] bytes = Encoding.UTF8.GetBytes(src);
byte[] array = md.ComputeHash(bytes);
string text = "";
for (int i = 0; i < array.Length; i++)
{
text += array[i].ToString("x2");
}
return text;
}
}
internal class RSACryptoServiceProviderExtension
{
// Token: 0x0600000C RID: 12 RVA: 0x00002408 File Offset: 0x00000608
private static void LoadPublicKeyDER(RSACryptoServiceProvider provider, byte[] DERData)
{
byte[] rsafromDER = RSACryptoServiceProviderExtension.GetRSAFromDER(DERData);
byte[] publicKeyBlobFromRSA = RSACryptoServiceProviderExtension.GetPublicKeyBlobFromRSA(rsafromDER);
provider.ImportCspBlob(publicKeyBlobFromRSA);
}
// Token: 0x0600000D RID: 13 RVA: 0x0000242C File Offset: 0x0000062C
internal static void LoadPublicKeyPEM(RSACryptoServiceProvider provider, string sPEM)
{
byte[] derfromPEM = RSACryptoServiceProviderExtension.GetDERFromPEM(sPEM);
RSACryptoServiceProviderExtension.LoadPublicKeyDER(provider, derfromPEM);
}
// Token: 0x0600000E RID: 14 RVA: 0x0000244C File Offset: 0x0000064C
private static byte[] GetPublicKeyBlobFromRSA(byte[] RSAData)
{
byte[] array = null;
uint num = 0U;
if (!RSACryptoServiceProviderExtension.CryptDecodeObject((RSACryptoServiceProviderExtension.CRYPT_ENCODING_FLAGS)65537U, new IntPtr(19), RSAData, (uint)RSAData.Length, RSACryptoServiceProviderExtension.CRYPT_DECODE_FLAGS.NONE, array, ref num))
{
throw new Win32Exception(Marshal.GetLastWin32Error());
}
array = new byte[num];
if (!RSACryptoServiceProviderExtension.CryptDecodeObject((RSACryptoServiceProviderExtension.CRYPT_ENCODING_FLAGS)65537U, new IntPtr(19), RSAData, (uint)RSAData.Length, RSACryptoServiceProviderExtension.CRYPT_DECODE_FLAGS.NONE, array, ref num))
{
throw new Win32Exception(Marshal.GetLastWin32Error());
}
return array;
}
// Token: 0x0600000F RID: 15 RVA: 0x000024C4 File Offset: 0x000006C4
internal static byte[] GetRSAFromDER(byte[] DERData)
{
byte[] array = null;
byte[] array2 = null;
uint num = 0U;
IntPtr zero = IntPtr.Zero;
if (!RSACryptoServiceProviderExtension.CryptDecodeObject((RSACryptoServiceProviderExtension.CRYPT_ENCODING_FLAGS)65537U, new IntPtr(8), DERData, (uint)DERData.Length, RSACryptoServiceProviderExtension.CRYPT_DECODE_FLAGS.NONE, array, ref num))
{
throw new Win32Exception(Marshal.GetLastWin32Error());
}
array = new byte[num];
if (RSACryptoServiceProviderExtension.CryptDecodeObject((RSACryptoServiceProviderExtension.CRYPT_ENCODING_FLAGS)65537U, new IntPtr(8), DERData, (uint)DERData.Length, RSACryptoServiceProviderExtension.CRYPT_DECODE_FLAGS.NONE, array, ref num))
{
GCHandle gchandle = GCHandle.Alloc(array, GCHandleType.Pinned);
try
{
RSACryptoServiceProviderExtension.CERT_PUBLIC_KEY_INFO cert_PUBLIC_KEY_INFO = (RSACryptoServiceProviderExtension.CERT_PUBLIC_KEY_INFO)Marshal.PtrToStructure(gchandle.AddrOfPinnedObject(), typeof(RSACryptoServiceProviderExtension.CERT_PUBLIC_KEY_INFO));
array2 = new byte[cert_PUBLIC_KEY_INFO.PublicKey.cbData];
Marshal.Copy(cert_PUBLIC_KEY_INFO.PublicKey.pbData, array2, 0, array2.Length);
}
finally
{
gchandle.Free();
}
return array2;
}
throw new Win32Exception(Marshal.GetLastWin32Error());
}
// Token: 0x06000010 RID: 16 RVA: 0x000025C0 File Offset: 0x000007C0
internal static byte[] GetDERFromPEM(string sPEM)
{
uint num = 0U;
uint num2;
uint num3;
if (!RSACryptoServiceProviderExtension.CryptStringToBinary(sPEM, (uint)sPEM.Length, RSACryptoServiceProviderExtension.CRYPT_STRING_FLAGS.CRYPT_STRING_BASE64HEADER, null, ref num, out num2, out num3))
{
throw new Win32Exception(Marshal.GetLastWin32Error());
}
byte[] array = new byte[num];
if (!RSACryptoServiceProviderExtension.CryptStringToBinary(sPEM, (uint)sPEM.Length, RSACryptoServiceProviderExtension.CRYPT_STRING_FLAGS.CRYPT_STRING_BASE64HEADER, array, ref num, out num2, out num3))
{
throw new Win32Exception(Marshal.GetLastWin32Error());
}
return array;
}
// Token: 0x06000011 RID: 17
[DllImport("advapi32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
internal static extern bool CryptDestroyKey(IntPtr hKey);
// Token: 0x06000012 RID: 18
[DllImport("advapi32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
internal static extern bool CryptImportKey(IntPtr hProv, byte[] pbKeyData, uint dwDataLen, IntPtr hPubKey, uint dwFlags, ref IntPtr hKey);
// Token: 0x06000013 RID: 19
[DllImport("advapi32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
internal static extern bool CryptReleaseContext(IntPtr hProv, int dwFlags);
// Token: 0x06000014 RID: 20
[DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
internal static extern bool CryptAcquireContext(ref IntPtr hProv, string pszContainer, string pszProvider, RSACryptoServiceProviderExtension.CRYPT_PROVIDER_TYPE dwProvType, RSACryptoServiceProviderExtension.CRYPT_ACQUIRE_CONTEXT_FLAGS dwFlags);
// Token: 0x06000015 RID: 21
[DllImport("crypt32.dll", CharSet = CharSet.Auto, SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
internal static extern bool CryptStringToBinary(string sPEM, uint sPEMLength, RSACryptoServiceProviderExtension.CRYPT_STRING_FLAGS dwFlags, [Out] byte[] pbBinary, ref uint pcbBinary, out uint pdwSkip, out uint pdwFlags);
// Token: 0x06000016 RID: 22
[DllImport("crypt32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
internal static extern bool CryptDecodeObjectEx(RSACryptoServiceProviderExtension.CRYPT_ENCODING_FLAGS dwCertEncodingType, IntPtr lpszStructType, byte[] pbEncoded, uint cbEncoded, RSACryptoServiceProviderExtension.CRYPT_DECODE_FLAGS dwFlags, IntPtr pDecodePara, ref byte[] pvStructInfo, ref uint pcbStructInfo);
// Token: 0x06000017 RID: 23
[DllImport("crypt32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
internal static extern bool CryptDecodeObject(RSACryptoServiceProviderExtension.CRYPT_ENCODING_FLAGS dwCertEncodingType, IntPtr lpszStructType, byte[] pbEncoded, uint cbEncoded, RSACryptoServiceProviderExtension.CRYPT_DECODE_FLAGS flags, [In][Out] byte[] pvStructInfo, ref uint cbStructInfo);
// Token: 0x02000005 RID: 5
internal enum CRYPT_ACQUIRE_CONTEXT_FLAGS : uint
{
// Token: 0x04000005 RID: 5
CRYPT_NEWKEYSET = 8U,
// Token: 0x04000006 RID: 6
CRYPT_DELETEKEYSET = 16U,
// Token: 0x04000007 RID: 7
CRYPT_MACHINE_KEYSET = 32U,
// Token: 0x04000008 RID: 8
CRYPT_SILENT = 64U,
// Token: 0x04000009 RID: 9
CRYPT_DEFAULT_CONTAINER_OPTIONAL = 128U,
// Token: 0x0400000A RID: 10
CRYPT_VERIFYCONTEXT = 4026531840U
}
// Token: 0x02000006 RID: 6
internal enum CRYPT_PROVIDER_TYPE : uint
{
// Token: 0x0400000C RID: 12
PROV_RSA_FULL = 1U
}
// Token: 0x02000007 RID: 7
internal enum CRYPT_DECODE_FLAGS : uint
{
// Token: 0x0400000E RID: 14
NONE,
// Token: 0x0400000F RID: 15
CRYPT_DECODE_ALLOC_FLAG = 32768U
}
// Token: 0x02000008 RID: 8
internal enum CRYPT_ENCODING_FLAGS : uint
{
// Token: 0x04000011 RID: 17
PKCS_7_ASN_ENCODING = 65536U,
// Token: 0x04000012 RID: 18
X509_ASN_ENCODING = 1U
}
// Token: 0x02000009 RID: 9
internal enum CRYPT_OUTPUT_TYPES
{
// Token: 0x04000014 RID: 20
X509_PUBLIC_KEY_INFO = 8,
// Token: 0x04000015 RID: 21
RSA_CSP_PUBLICKEYBLOB = 19,
// Token: 0x04000016 RID: 22
PKCS_RSA_PRIVATE_KEY = 43,
// Token: 0x04000017 RID: 23
PKCS_PRIVATE_KEY_INFO
}
// Token: 0x0200000A RID: 10
internal enum CRYPT_STRING_FLAGS : uint
{
// Token: 0x04000019 RID: 25
CRYPT_STRING_BASE64HEADER,
// Token: 0x0400001A RID: 26
CRYPT_STRING_BASE64,
// Token: 0x0400001B RID: 27
CRYPT_STRING_BINARY,
// Token: 0x0400001C RID: 28
CRYPT_STRING_BASE64REQUESTHEADER,
// Token: 0x0400001D RID: 29
CRYPT_STRING_HEX,
// Token: 0x0400001E RID: 30
CRYPT_STRING_HEXASCII,
// Token: 0x0400001F RID: 31
CRYPT_STRING_BASE64_ANY,
// Token: 0x04000020 RID: 32
CRYPT_STRING_ANY,
// Token: 0x04000021 RID: 33
CRYPT_STRING_HEX_ANY,
// Token: 0x04000022 RID: 34
CRYPT_STRING_BASE64X509CRLHEADER,
// Token: 0x04000023 RID: 35
CRYPT_STRING_HEXADDR,
// Token: 0x04000024 RID: 36
CRYPT_STRING_HEXASCIIADDR,
// Token: 0x04000025 RID: 37
CRYPT_STRING_HEXRAW,
// Token: 0x04000026 RID: 38
CRYPT_STRING_NOCRLF = 1073741824U,
// Token: 0x04000027 RID: 39
CRYPT_STRING_NOCR = 2147483648U
}
// Token: 0x0200000B RID: 11
internal class CRYPT_OBJID_BLOB
{
// Token: 0x04000028 RID: 40
internal uint cbData = default;
// Token: 0x04000029 RID: 41
internal IntPtr pbData = default;
}
// Token: 0x0200000C RID: 12
internal class CRYPT_ALGORITHM_IDENTIFIER
{
// Token: 0x0400002A RID: 42
internal IntPtr pszObjId = default;
// Token: 0x0400002B RID: 43
internal RSACryptoServiceProviderExtension.CRYPT_OBJID_BLOB Parameters = default;
}
// Token: 0x0200000D RID: 13
private class CRYPT_BIT_BLOB
{
// Token: 0x0400002C RID: 44
internal uint cbData = default;
// Token: 0x0400002D RID: 45
internal IntPtr pbData = default;
// Token: 0x0400002E RID: 46
internal uint cUnusedBits = default;
}
// Token: 0x0200000E RID: 14
private class CERT_PUBLIC_KEY_INFO
{
// Token: 0x0400002F RID: 47
internal RSACryptoServiceProviderExtension.CRYPT_ALGORITHM_IDENTIFIER Algorithm = default;
// Token: 0x04000030 RID: 48
internal RSACryptoServiceProviderExtension.CRYPT_BIT_BLOB PublicKey = default;
}
}
}

@ -1,37 +0,0 @@

namespace Tiobon.Core.Common.Static
{
public static class StaticPayInfo
{
/// <summary>
/// 商户号
/// </summary>
public readonly static string MERCHANTID = AppSettings.app(new string[] { "PayInfo", "MERCHANTID" }).ObjToString();
/// <summary>
/// 柜台号
/// </summary>
public readonly static string POSID = AppSettings.app(new string[] { "PayInfo", "POSID" }).ObjToString();
/// <summary>
/// 分行号
/// </summary>
public readonly static string BRANCHID = AppSettings.app(new string[] { "PayInfo", "BRANCHID" }).ObjToString();
/// <summary>
/// 公钥
/// </summary>
public readonly static string pubKey = AppSettings.app(new string[] { "PayInfo", "pubKey" }).ObjToString();
/// <summary>
/// 操作员号
/// </summary>
public readonly static string USER_ID = AppSettings.app(new string[] { "PayInfo", "USER_ID" }).ObjToString();
/// <summary>
/// 密码
/// </summary>
public readonly static string PASSWORD = AppSettings.app(new string[] { "PayInfo", "PASSWORD" }).ObjToString();
/// <summary>
/// 外联平台通讯地址
/// </summary>
public readonly static string OutAddress = AppSettings.app(new string[] { "PayInfo", "OutAddress" }).ObjToString();
}
}

@ -57,6 +57,7 @@
<ItemGroup>
<Folder Include="Core\" />
<Folder Include="Static\" />
</ItemGroup>
</Project>

@ -53,7 +53,7 @@ namespace Tiobon.Core.Extensions
Log.Error("Tiobon.Core.xml和Tiobon.Core.Model.xml 丢失,请检查并拷贝。\n" + ex.Message);
}
c.MapType<QueryFilter>(() => new OpenApiSchema { Type = "string", Format = "string" });
//c.MapType<QueryFilter>(() => new OpenApiSchema { Type = "string", Format = "string" });
// ids4和jwt切换

@ -1,14 +0,0 @@
using Tiobon.Core.IServices.BASE;
using Tiobon.Core.Model.Models;
namespace Tiobon.Core.IServices
{
/// <summary>
/// IAccessTrendLogServices
/// </summary>
public interface IAccessTrendLogServices : IBaseServices<AccessTrendLog>
{
}
}

@ -1,42 +0,0 @@

using Tiobon.Core.IServices.BASE;
using Tiobon.Core.Model;
using Tiobon.Core.Model.ViewModels;
using System.Threading.Tasks;
namespace Tiobon.Core.IServices
{
/// <summary>
/// IPayServices
/// </summary>
public interface IPayServices : IBaseServices<RootEntityTkey<int>>
{
/// <summary>
/// 被扫支付
/// </summary>
/// <returns></returns>
Task<ServiceResult<PayReturnResultModel>> Pay(PayNeedModel payModel);
/// <summary>
/// 退款
/// </summary>
/// <param name="payModel"></param>
/// <returns></returns>
Task<ServiceResult<PayRefundReturnResultModel>> PayRefund(PayRefundNeedModel payModel);
/// <summary>
/// 轮询查询
/// </summary>
/// <param name="payModel"></param>
/// <param name="times">轮询次数</param>
/// <returns></returns>
Task<ServiceResult<PayReturnResultModel>> PayCheck(PayNeedModel payModel,int times);
/// <summary>
/// 验证签名
/// </summary>
/// <param name="strSrc">参数</param>
/// <param name="sign">签名</param>
/// <param name="pubKey">公钥</param>
/// <returns></returns>
bool NotifyCheck(string strSrc, string sign, string pubKey);
}
}

@ -1,7 +1,4 @@
using Microsoft.Extensions.DependencyInjection;
using Serilog.Core;
using System;
using Tiobon.Core.Common;
using Tiobon.Core.Tasks;
namespace Tiobon.Core.Jobs;

@ -108,7 +108,7 @@
"DBType": 1,
"Enabled": true,
"Connection": "Data Source=47.99.54.186;User ID=GHR;Password=Tiobon20190101;Database=GHR30;Encrypt=True;TrustServerCertificate=True;",
//"Connection": "Data Source=116.204.98.209;User ID=Tiobon;Password=&($!4UGUyU#$2sp9O;Database=Tiobon;Encrypt=True;TrustServerCertificate=True;",
"Connection1": "Data Source=47.99.54.186;User ID=GHR;Password=Tiobon20190101;Database=GHR5_TY;Encrypt=True;TrustServerCertificate=True;",
"ProviderName": "System.Data.SqlClient"
},
{
@ -230,7 +230,8 @@
},
"Nacos": {
"Enabled": false //Nacos
}
},
"FrontUrl": "https://g.tiobon.com"
},
"Middleware": {
"RequestResponseLog": {
@ -336,15 +337,6 @@
"ServiceHealthCheck": "/healthcheck",
"ConsulAddress": "http://localhost:8500"
},
"PayInfo": { //
"MERCHANTID": "", //
"POSID": "", //
"BRANCHID": "", //
"pubKey": "", //
"USER_ID": "", //
"PASSWORD": "", //
"OutAddress": "http://127.0.0.1:12345" //
},
"nacos": {
"ServerAddresses": [ "http://localhost:8848" ], // nacos
"DefaultTimeOut": 15000, //
@ -368,5 +360,10 @@
"Enabled": true,
"Address": "http://localhost:5341/",
"ApiKey": ""
},
"Resume": {
"CompanyName": "乔邦科技",
"LoginDesc": "应聘人员简历登记表",
"LoginTitle": "欢迎访问"
}
}
}

@ -1,30 +0,0 @@
namespace Tiobon.Core.Model
{
public enum AuthorityScopeEnum
{
/// <summary>
/// 无任何权限
/// </summary>
NONE = -1,
/// <summary>
/// 自定义权限
/// </summary>
Custom = 1,
/// <summary>
/// 本部门
/// </summary>
MyDepart = 2,
/// <summary>
/// 本部门及以下
/// </summary>
MyDepartAndDown = 3,
/// <summary>
/// 仅自己
/// </summary>
OnlySelf = 4,
/// <summary>
/// 所有
/// </summary>
ALL = 9
}
}

@ -1,27 +0,0 @@
using SqlSugar;
using System;
namespace Tiobon.Core.Model.Models
{
/// <summary>
/// 用户访问趋势日志
/// </summary>
public class AccessTrendLog : RootEntityTkey<long>
{
/// <summary>
/// 用户
/// </summary>
[SugarColumn(Length = 128, IsNullable = true)]
public string UserInfo { get; set; }
/// <summary>
/// 次数
/// </summary>
public int Count { get; set; }
/// <summary>
/// 更新时间
/// </summary>
public DateTime UpdateTime { get; set; } = DateTime.Now;
}
}

@ -2,8 +2,8 @@
{
/// <summary>
/// 所需分页参数
/// 作者:胡丁文
/// 时间:2020-4-3 20:31:26
/// 作者:SimonHsiao
/// 时间:2024-5-3 20:31:26
/// </summary>
public class PaginationModel
{

@ -1,23 +0,0 @@
using System.ComponentModel;
namespace Tiobon.Core.Model
{
public enum ResponseEnum
{
/// <summary>
/// 无权限
/// </summary>
[Description("无权限")]
NoPermissions = 401,
/// <summary>
/// 找不到指定资源
/// </summary>
[Description("找不到指定资源")]
NoFound = 404,
/// <summary>
/// 找不到指定资源
/// </summary>
[Description("服务器错误")]
ServerError = 500
}
}

@ -1,27 +0,0 @@
using System.Collections.Generic;
namespace Tiobon.Core.Model
{
/// <summary>
/// 表格数据,支持分页
/// </summary>
public class TableModel<T>
{
/// <summary>
/// 返回编码
/// </summary>
public int Code { get; set; }
/// <summary>
/// 返回信息
/// </summary>
public string Msg { get; set; }
/// <summary>
/// 记录总数
/// </summary>
public int Count { get; set; }
/// <summary>
/// 返回数据集
/// </summary>
public List<T> Data { get; set; }
}
}

@ -1,102 +0,0 @@
namespace Tiobon.Core.Model.ViewModels
{
public class PayModel
{
/// <summary>
/// 商户号
/// </summary>
public string MERCHANTID { get; set; }//105910100190000");// => self::MERCHANTID, // 商户号
/// <summary>
/// 柜台号
/// </summary>
public string POSID { get; set; } //610000000");// => self::POSID, // 柜台号
/// <summary>
/// 分行号
/// </summary>
public string BRANCHID { get; set; } //610000000");// => self::BRANCHID, // 分行号
/// <summary>
/// 集团商户信息
/// </summary>
public string GROUPMCH { get; set; } //;// => '', // 集团商户信息
/// <summary>
/// 交易码
/// </summary>
public string TXCODE { get; set; } //PAY100");// => 'PAY100', // 交易码
/// <summary>
/// 商户类型
/// </summary>
public string MERFLAG { get; set; } //// => '', // 商户类型
/// <summary>
/// 终端编号 1
/// </summary>
public string TERMNO1 { get; set; } //// => '', // 终端编号 1
/// <summary>
/// 终端编号 2
/// </summary>
public string TERMNO2 { get; set; } //// => '', // 终端编号 2
/// <summary>
/// 订单号
/// </summary>
public string ORDERID { get; set; }//// => '', // 订单号
/// <summary>
/// 码信息(一维码、二维码)
/// </summary>
public string QRCODE { get; set; } //// => '', // 码信息(一维码、二维码)
/// <summary>
/// 订单金额,单位:元
/// </summary>
public string AMOUNT { get; set; } //");// => '0.01', // 订单金额,单位:元
/// <summary>
/// 商品名称
/// </summary>
public string PROINFO { get; set; } //// => '', // 商品名称
/// <summary>
/// 备注 1
/// </summary>
public string REMARK1 { get; set; } //// => '', // 备注 1
/// <summary>
/// 备注 2
/// </summary>
public string REMARK2 { get; set; }//// => '', // 备注 2
/// <summary>
/// 分账信息一
/// </summary>
public string FZINFO1 { get; set; } //// => '', // 分账信息一
/// <summary>
/// 分账信息二
/// </summary>
public string FZINFO2 { get; set; } //// => '', // 分账信息二
/// <summary>
/// 子商户公众账号 ID
/// </summary>
public string SUB_APPID { get; set; } //);// => '', // 子商户公众账号 ID
/// <summary>
/// 返回信息位图
/// </summary>
public string RETURN_FIELD { get; set; }// "");// => '', // 返回信息位图
/// <summary>
/// 实名支付
/// </summary>
public string USERPARAM { get; set; } //);// => '', // 实名支付
/// <summary>
/// 商品详情
/// </summary>
public string detail { get; set; }//// => '', // 商品详情
/// <summary>
/// 订单优惠标记
/// </summary>
public string goods_tag { get; set; } //);// => '', // 订单优惠标记
/// <summary>
/// 公钥
/// </summary>
public string pubKey { get; set; }
/// <summary>
/// 请求地址
/// </summary>
public string url { get; set; }
/// <summary>
/// 是否删除空值
/// </summary>
public bool deleteEmpty { get; set; }
}
}

@ -1,34 +0,0 @@
namespace Tiobon.Core.Model.ViewModels
{
/// <summary>
/// 退款参数
/// </summary>
public class PayNeedModel
{
/// <summary>
/// 订单ID
/// </summary>
public string ORDERID { get; set; }
/// <summary>
/// 商品名称
/// </summary>
public string PROINFO { get; set; }
/// <summary>
/// 支付金额(小数点最多两位)
/// </summary>
public string AMOUNT { get; set; }
/// <summary>
/// 二维码/条码信息
/// </summary>
public string QRCODE { get; set; }
/// <summary>
/// 备注信息1
/// </summary>
public string REMARK1 { get; set; }
/// <summary>
/// 备注信息2
/// </summary>
public string REMARK2 { get; set; }
}
}

@ -1,21 +0,0 @@
namespace Tiobon.Core.Model.ViewModels
{
/// <summary>
/// 订单参数
/// </summary>
public class PayRefundNeedModel
{
/// <summary>
/// 订单号
/// </summary>
public string ORDER { get; set; }
/// <summary>
/// 退款金额
/// </summary>
public string MONEY { get; set; }
/// <summary>
/// 退款流水号(可选)
/// </summary>
public string REFUND_CODE { get; set; }
}
}

@ -1,37 +0,0 @@
namespace Tiobon.Core.Model.ViewModels
{
/// <summary>
/// 退款返回消息
/// </summary>
public class PayRefundReturnModel
{
/// <summary>
/// 序列号
/// </summary>
public string REQUEST_SN { get; set; }
/// <summary>
/// 商户号
/// </summary>
public string CUST_ID { get; set; }
/// <summary>
/// 交易码
/// </summary>
public string TX_CODE { get; set; }
/// <summary>
/// 返回码
/// </summary>
public string RETURN_CODE { get; set; }
/// <summary>
/// 返回码说明
/// </summary>
public string RETURN_MSG { get; set; }
/// <summary>
/// 语言
/// </summary>
public string LANGUAGE { get; set; }
/// <summary>
/// 订单信息
/// </summary>
public PayRefundReturnOrderInfoModel TX_INFO { get; set; }
}
}

@ -1,30 +0,0 @@
namespace Tiobon.Core.Model.ViewModels
{
/// <summary>
/// 订单信息
/// </summary>
public class PayRefundReturnOrderInfoModel
{
/// <summary>
/// 订单号
/// </summary>
public string ORDER_NUM { get; set; }
/// <summary>
/// 支付金额
/// </summary>
public string PAY_AMOUNT { get; set; }
/// <summary>
/// 退款金额
/// </summary>
public string AMOUNT { get; set; }
/// <summary>
/// 备注1
/// </summary>
public string REM1 { get; set; }
/// <summary>
/// 备注2
/// </summary>
public string REM2 { get; set; }
}
}

@ -1,45 +0,0 @@
namespace Tiobon.Core.Model.ViewModels
{
/// <summary>
/// 退款返回结果消息
/// </summary>
public class PayRefundReturnResultModel
{
/// <summary>
/// 订单号
/// </summary>
public string ORDER_NUM { get; set; }
/// <summary>
/// 支付金额
/// </summary>
public string PAY_AMOUNT { get; set; }
/// <summary>
/// 退款金额
/// </summary>
public string AMOUNT { get; set; }
/// <summary>
/// 序列号
/// </summary>
public string REQUEST_SN { get; set; }
/// <summary>
/// 商户号
/// </summary>
public string CUST_ID { get; set; }
/// <summary>
/// 交易码
/// </summary>
public string TX_CODE { get; set; }
/// <summary>
/// 返回码
/// </summary>
public string RETURN_CODE { get; set; }
/// <summary>
/// 返回码说明
/// </summary>
public string RETURN_MSG { get; set; }
/// <summary>
/// 语言
/// </summary>
public string LANGUAGE { get; set; }
}
}

@ -1,53 +0,0 @@
namespace Tiobon.Core.Model.ViewModels
{
/// <summary>
/// 支付结果dto
/// </summary>
public class PayResultModel
{
/// <summary>
/// 支付结果
/// Y:成功
/// N:失败
/// U:不确定
/// Q:待轮询
/// </summary>
public string RESULT { get; set; }
/// <summary>
/// 订单ID
/// </summary>
public string ORDERID { get; set; }
/// <summary>
/// 支付金额
/// </summary>
public string AMOUNT { get; set; }
/// <summary>
/// 二维码类型
/// 1:龙支付
/// 2:微信
/// 3:支付宝
/// 4:银联
/// </summary>
public string QRCODETYPE { get; set; }
/// <summary>
/// 等待时间-轮询等待时间
/// </summary>
public string WAITTIME { get; set; }
/// <summary>
/// 全局事件跟踪号-建行交易流水号
/// </summary>
public string TRACEID { get; set; }
/// <summary>
/// 错误码
/// </summary>
public string ERRCODE { get; set; }
/// <summary>
/// 错误信息
/// </summary>
public string ERRMSG { get; set; }
/// <summary>
/// 验证签名-防止伪造攻击
/// </summary>
public string SIGN { get; set; }
}
}

@ -1,39 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Tiobon.Core.Model.ViewModels
{
/// <summary>
/// 返回支付结果
/// </summary>
public class PayReturnResultModel
{
/// <summary>
/// 发起的订单ID
/// </summary>
public string ORDERID { get; set; }
/// <summary>
/// 返回支付的金额
/// </summary>
public string AMOUNT { get; set; }
/// <summary>
/// 返回支付的类型 1:龙支付 2:微信 3:支付宝 4:银联
/// </summary>
public string QRCODETYPE { get; set; }
/// <summary>
/// 返回建行的流水号
/// </summary>
public string TRACEID { get; set; }
/// <summary>
/// 错误代码
/// </summary>
public string ERRCODE { get; set; }
/// <summary>
/// 错误信息
/// </summary>
public string ERRMSG { get; set; }
}
}

@ -1,12 +0,0 @@
using Tiobon.Core.IRepository.Base;
using Tiobon.Core.IServices;
using Tiobon.Core.Model.Models;
using Tiobon.Core.Services.BASE;
namespace Tiobon.Core.Services
{
public partial class AccessTrendLogServices : BaseServices<AccessTrendLog>, IAccessTrendLogServices
{
}
}

@ -1155,22 +1155,6 @@ public class BaseServices<TEntity, TEntityDto, TInsertDto, TEditDto> : IBaseServ
//}
}
/// <summary>
/// 获取根据ID查询的条件
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
protected QueryFilter QueryFilterById(Guid id)
{
return new QueryFilter
{
PageIndex = 1,
PageSize = 1,
Sorting = string.Empty,
Conditions = string.Empty
};
}
#region 检查表中是否已经存在相同代码的数据
public static void CheckOnly(TEntity entity, long? id = null)

@ -1,6 +1,4 @@
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using Mysqlx.Expr;
using System.Text.RegularExpressions;
namespace Tiobon.Core.Services;
@ -8,11 +6,9 @@ namespace Tiobon.Core.Services;
public partial class CommonServices : BaseServices<RootEntityTkey<int>>, ICommonServices
{
IHttpContextAccessor _httpContextAccessor;
ILogger<PayServices> _logger;
public ICaching _caching;
public CommonServices(ILogger<PayServices> logger, IHttpContextAccessor httpContextAccessor, ICaching caching = null)
public CommonServices(IHttpContextAccessor httpContextAccessor, ICaching caching = null)
{
_logger = logger;
_httpContextAccessor = httpContextAccessor;
_caching = caching;
}

@ -1,400 +0,0 @@
using Microsoft.Extensions.Logging;
using System.Text;
using Tiobon.Core.Common.Static;
namespace Tiobon.Core.Services;
public partial class PayServices : BaseServices<RootEntityTkey<int>>, IPayServices
{
IHttpContextAccessor _httpContextAccessor;
ILogger<PayServices> _logger;
public PayServices(ILogger<PayServices> logger, IHttpContextAccessor httpContextAccessor)
{
_logger = logger;
_httpContextAccessor = httpContextAccessor;
}
public async Task<ServiceResult<PayReturnResultModel>> Pay(PayNeedModel payModel)
{
_logger.LogInformation("支付开始");
ServiceResult<PayReturnResultModel> messageModel = new ServiceResult<PayReturnResultModel>();
messageModel.Data = new PayReturnResultModel();
string url = string.Empty;
string param = string.Empty;
string returnData = string.Empty;
try
{
_logger.LogInformation($"原始GET参数->{_httpContextAccessor.HttpContext.Request.QueryString}");
//被扫支付
string host = "https://ibsbjstar.ccb.com.cn/CCBIS/B2CMainPlat_00_BEPAY?";
////商户信息
//string merInfo = "MERCHANTID=105910100190000&POSID=000000000&BRANCHID=610000000";
////获取柜台完整公钥
//string pubKey = "30819d300d06092a864886f70d010101050003818b0030818702818100a32fb2d51dda418f65ca456431bd2f4173e41a82bb75c2338a6f649f8e9216204838d42e2a028c79cee19144a72b5b46fe6a498367bf4143f959e4f73c9c4f499f68831f8663d6b946ae9fa31c74c9332bebf3cba1a98481533a37ffad944823bd46c305ec560648f1b6bcc64d54d32e213926b26cd10d342f2c61ff5ac2d78b020111";
////加密原串
//string param = merInfo + "&MERFLAG=1&TERMNO1=&TERMNO2=&ORDERID=937857156" +
// "&QRCODE=134737690209713400&AMOUNT=0.01&TXCODE=PAY100&PROINFO=&REMARK1=&REMARK2=&SMERID=&SMERNAME=&SMERTYPEID=" +
// "&SMERTYPE=&TRADECODE=&TRADENAME=&SMEPROTYPE=&PRONAME=";
Dictionary<string, object> dic = new Dictionary<string, object>();
//支付信息
dic.Add("MERCHANTID", StaticPayInfo.MERCHANTID);// => self::MERCHANTID, // 商户号
dic.Add("POSID", StaticPayInfo.POSID);// => self::POSID, // 柜台号
dic.Add("BRANCHID", StaticPayInfo.BRANCHID);// => self::BRANCHID, // 分行号
dic.Add("TXCODE", "PAY100");// => 'PAY100', // 交易码
dic.Add("MERFLAG", "1");// => '', // 商户类型 1线上 2线下
dic.Add("ORDERID", payModel.ORDERID);//payModel.ORDERID);// => '', // 订单号
dic.Add("QRCODE", payModel.QRCODE);// => '', // 码信息(一维码、二维码)
dic.Add("AMOUNT", payModel.AMOUNT);// => '0.01', // 订单金额,单位:元
dic.Add("PROINFO", payModel.PROINFO);// => '', // 商品名称
dic.Add("REMARK1", payModel.REMARK1);// => '', // 备注 1
dic.Add("REMARK2", payModel.REMARK2);// => '', // 备注 2
//dic.Add("TERMNO1", "");// => '', // 终端编号 1
//dic.Add("TERMNO2", "");// => '', // 终端编号 2
//dic.Add("GROUPMCH", "");// => '', // 集团商户信息
//dic.Add("FZINFO1", "");// => '', // 分账信息一
//dic.Add("FZINFO2", "");// => '', // 分账信息二
//dic.Add("SUB_APPID", "");// => '', // 子商户公众账号 ID
//dic.Add("RETURN_FIELD", "");// => '', // 返回信息位图
//dic.Add("USERPARAM", "");// => '', // 实名支付
//dic.Add("detail", "");// => '', // 商品详情
//dic.Add("goods_tag", "");// => '', // 订单优惠标记
//商户信息
Dictionary<string, object> dicInfo = new Dictionary<string, object>();
dicInfo.Add("MERCHANTID", StaticPayInfo.MERCHANTID);// => self::MERCHANTID, // 商户号
dicInfo.Add("POSID", StaticPayInfo.POSID);// => self::POSID, // 柜台号
dicInfo.Add("BRANCHID", StaticPayInfo.BRANCHID);// => self::BRANCHID, // 分行号
var Info = StringHelper.GetPars(dicInfo);
//获取拼接请求串
param = StringHelper.GetPars(dic);
//加密
var paramEncryption = new CCBPayUtil().makeCCBParam(param, StaticPayInfo.pubKey);
//拼接请求串
url = host + Info + "&ccbParam=" + paramEncryption;
//请求
_logger.LogInformation($"请求地址->{url}");
_logger.LogInformation($"请求参数->{param}");
PayResultModel payResult;
try
{
returnData = await HttpHelper.PostAsync(url);
//转换数据
try
{
payResult = JsonHelper.ParseFormByJson<PayResultModel>(returnData);
}
catch
{
payResult = new PayResultModel { RESULT = "N", ERRMSG = "参数错误", ORDERID = payModel.ORDERID, AMOUNT = payModel.AMOUNT };
returnData = StringHelper.GetCusLine(returnData, 15);
}
_logger.LogInformation($"响应数据->{returnData}");
}
catch (Exception ex)
{
_logger.LogInformation($"异常信息:{ex.Message}");
_logger.LogInformation($"异常堆栈:{ex.StackTrace}");
messageModel = await PayCheck(payModel, 1);
return messageModel;
}
switch (payResult.RESULT)
{
case "Y":
Dictionary<string, object> dicCheckPars = new Dictionary<string, object>();
dicCheckPars.Add("RESULT", payResult.RESULT);
dicCheckPars.Add("ORDERID", payResult.ORDERID);
dicCheckPars.Add("AMOUNT", payResult.AMOUNT);
dicCheckPars.Add("WAITTIME", payResult.WAITTIME);
dicCheckPars.Add("TRACEID", payResult.TRACEID);
string strCheckPars = StringHelper.GetPars(dicCheckPars);
if (NotifyCheck(strCheckPars, payResult.SIGN, StaticPayInfo.pubKey))
{
messageModel.Success = true;
messageModel.Message = "支付成功";
}
else
{
messageModel.Success = false;
messageModel.Message = "签名失败";
}
break;
case "N":
messageModel.Success = false;
messageModel.Message = "支付失败";
break;
case "U":
case "Q":
int waittime = payResult.WAITTIME.ObjToInt();
if (waittime <= 0) waittime = 5;//如果需要等待默认等待5秒后再次查询
Thread.Sleep(waittime * 1000);
//轮询查询
messageModel = await PayCheck(payModel, 1);
break;
default:
messageModel.Success = false;
messageModel.Message = "支付失败";
break;
}
messageModel.Data.ORDERID = payResult.ORDERID;
messageModel.Data.ERRCODE = payResult.ERRCODE;
messageModel.Data.ERRMSG = payResult.ERRMSG;
messageModel.Data.TRACEID = payResult.TRACEID;
messageModel.Data.AMOUNT = payResult.AMOUNT;
messageModel.Data.QRCODETYPE = payResult.QRCODETYPE;
}
catch (Exception ex)
{
messageModel.Success = false;
messageModel.Message = "服务错误";
messageModel.Data.ERRMSG = ex.Message;
_logger.LogInformation($"异常信息:{ex.Message}");
_logger.LogInformation($"异常堆栈:{ex.StackTrace}");
}
finally
{
_logger.LogInformation($"返回数据->{JsonHelper.GetJSON<ServiceResult<PayReturnResultModel>>(messageModel)}");
_logger.LogInformation("支付结束");
}
return messageModel;
}
public async Task<ServiceResult<PayRefundReturnResultModel>> PayRefund(PayRefundNeedModel payModel)
{
_logger.LogInformation("退款开始");
ServiceResult<PayRefundReturnResultModel> messageModel = new ServiceResult<PayRefundReturnResultModel>();
messageModel.Data = new PayRefundReturnResultModel();
try
{
_logger.LogInformation($"原始GET参数->{_httpContextAccessor.HttpContext.Request.QueryString}");
string REQUEST_SN = StringHelper.GetGuidToLongID().ToString().Substring(0, 16);//请求序列码
string CUST_ID = StaticPayInfo.MERCHANTID;//商户号
string USER_ID = StaticPayInfo.USER_ID;//操作员号
string PASSWORD = StaticPayInfo.PASSWORD;//密码
string TX_CODE = "5W1004";//交易码
string LANGUAGE = "CN";//语言
//string SIGN_INFO = "";//签名信息
//string SIGNCERT = "";//签名CA信息
//外联平台客户端服务部署的地址+设置的监听端口
string sUrl = StaticPayInfo.OutAddress;
//XML请求报文
//string sRequestMsg = $" requestXml=<?xml version=\"1.0\" encoding=\"GB2312\" standalone=\"yes\" ?><TX><REQUEST_SN>{REQUEST_SN}</REQUEST_SN><CUST_ID>{CUST_ID}</CUST_ID><USER_ID>{USER_ID}</USER_ID><PASSWORD>{PASSWORD}</PASSWORD><TX_CODE>{TX_CODE}</TX_CODE><LANGUAGE>{LANGUAGE}</LANGUAGE><TX_INFO><MONEY>{payModel.MONEY}</MONEY><ORDER>{payModel.ORDER}</ORDER><REFUND_CODE>{payModel.REFUND_CODE}</REFUND_CODE></TX_INFO><SIGN_INFO></SIGN_INFO><SIGNCERT></SIGNCERT></TX> ";
string sRequestMsg = $"<?xml version=\"1.0\" encoding=\"GB2312\" standalone=\"yes\" ?><TX><REQUEST_SN>{REQUEST_SN}</REQUEST_SN><CUST_ID>{CUST_ID}</CUST_ID><USER_ID>{USER_ID}</USER_ID><PASSWORD>{PASSWORD}</PASSWORD><TX_CODE>{TX_CODE}</TX_CODE><LANGUAGE>{LANGUAGE}</LANGUAGE><TX_INFO><MONEY>{payModel.MONEY}</MONEY><ORDER>{payModel.ORDER}</ORDER><REFUND_CODE>{payModel.REFUND_CODE}</REFUND_CODE></TX_INFO><SIGN_INFO></SIGN_INFO><SIGNCERT></SIGNCERT></TX> ";
//string sRequestMsg = readRequestFile("E:/02-外联平台/06-测试/测试报文/商户网银/客户端连接-5W1001-W06.txt");
//注意:请求报文必须放在requestXml参数送
sRequestMsg = "requestXml=" + sRequestMsg;
_logger.LogInformation("请求地址:" + sUrl);
_logger.LogInformation("请求报文:" + sRequestMsg);
HttpClient request = new HttpClient();
byte[] byteRquest = Encoding.GetEncoding("GB18030").GetBytes(sRequestMsg);
ByteArrayContent bytemsg = new ByteArrayContent(byteRquest);
HttpResponseMessage resulthd = await request.PostAsync(sUrl, bytemsg);
Stream result = await resulthd.Content.ReadAsStreamAsync();
StreamReader readerResult = new StreamReader(result, System.Text.Encoding.GetEncoding("GB18030"));
string sResult = await readerResult.ReadToEndAsync();
_logger.LogInformation("响应报文:" + sResult);
var Xmlresult = XmlHelper.ParseFormByXml<PayRefundReturnModel>(sResult, "TX");
if (Xmlresult.RETURN_CODE.Equals("000000"))
{
messageModel.Success = true;
messageModel.Message = "退款成功";
}
else
{
messageModel.Success = false;
messageModel.Message = "退款失败";
}
messageModel.Data.RETURN_MSG = Xmlresult.RETURN_MSG;
messageModel.Data.TX_CODE = Xmlresult.TX_CODE;
messageModel.Data.REQUEST_SN = Xmlresult.REQUEST_SN;
messageModel.Data.RETURN_CODE = Xmlresult.RETURN_CODE;
messageModel.Data.CUST_ID = Xmlresult.CUST_ID;
messageModel.Data.LANGUAGE = Xmlresult.LANGUAGE;
messageModel.Data.AMOUNT = Xmlresult.TX_INFO?.AMOUNT;
messageModel.Data.PAY_AMOUNT = Xmlresult.TX_INFO?.PAY_AMOUNT;
messageModel.Data.ORDER_NUM = Xmlresult.TX_INFO?.ORDER_NUM;
request.Dispose();
}
catch (Exception ex)
{
messageModel.Success = false;
messageModel.Message = "服务错误";
messageModel.Data.RETURN_MSG = ex.Message;
_logger.LogInformation($"异常信息:{ex.Message}");
_logger.LogInformation($"异常堆栈:{ex.StackTrace}");
}
finally
{
_logger.LogInformation($"返回数据->{JsonHelper.GetJSON<ServiceResult<PayRefundReturnResultModel>>(messageModel)}");
_logger.LogInformation("退款结束");
}
return messageModel;
}
public async Task<ServiceResult<PayReturnResultModel>> PayCheck(PayNeedModel payModel, int times)
{
_logger.LogInformation("轮询开始");
ServiceResult<PayReturnResultModel> messageModel = new ServiceResult<PayReturnResultModel>();
messageModel.Data = new PayReturnResultModel();
string url = string.Empty;
string param = string.Empty;
string returnData = string.Empty;
try
{
//设置最大轮询次数,跟建行保持一致
int theLastTime = 6;
if (times > theLastTime) throw new Exception($"轮询次数超过最大次数{theLastTime}");
string host = "https://ibsbjstar.ccb.com.cn/CCBIS/B2CMainPlat_00_BEPAY?";
Dictionary<string, object> dic = new Dictionary<string, object>();
dic.Add("MERCHANTID", StaticPayInfo.MERCHANTID);// => self::MERCHANTID, // 商户号
dic.Add("POSID", StaticPayInfo.POSID);// => self::POSID, // 柜台号
dic.Add("BRANCHID", StaticPayInfo.BRANCHID);// => self::BRANCHID, // 分行号
dic.Add("TXCODE", "PAY101");// => 'PAY100', // 交易码
dic.Add("QRYTIME", times.ToString());// => '', // 查询此时(每次加1)
dic.Add("MERFLAG", "1");// => '', // 商户类型
dic.Add("ORDERID", payModel.ORDERID);// => '', // 订单号
dic.Add("QRCODE", payModel.QRCODE);// => '', // 码信息(一维码、二维码)
//dic.Add("GROUPMCH", "");// => '', // 集团商户信息
//dic.Add("QRCODETYPE", "");// => '', // 支付类型1:龙支付 2:微信 3:支付宝 4:银联
//dic.Add("TERMNO1", "");// => '', // 终端编号 1
//dic.Add("TERMNO2", "");// => '', // 终端编号 2
//dic.Add("AMOUNT", "");// => '0.01', // 订单金额,单位:元
//dic.Add("PROINFO", "");// => '', // 商品名称
//dic.Add("REMARK1", "");// => '', // 备注 1
//dic.Add("REMARK2", "");// => '', // 备注 2
//dic.Add("FZINFO1", "");// => '', // 分账信息一
//dic.Add("FZINFO2", "");// => '', // 分账信息二
//dic.Add("SUB_APPID", "");// => '', // 子商户公众账号 ID
//dic.Add("RETURN_FIELD", "");// => '', // 返回信息位图
//dic.Add("USERPARAM", "");// => '', // 实名支付
//dic.Add("detail", "");// => '', // 商品详情
//dic.Add("goods_tag", "");// => '', // 订单优惠标记
//商户信息
Dictionary<string, object> dicInfo = new Dictionary<string, object>();
dicInfo.Add("MERCHANTID", StaticPayInfo.MERCHANTID);// => self::MERCHANTID, // 商户号
dicInfo.Add("POSID", StaticPayInfo.POSID);// => self::POSID, // 柜台号
dicInfo.Add("BRANCHID", StaticPayInfo.BRANCHID);// => self::BRANCHID, // 分行号
var Info = StringHelper.GetPars(dicInfo);
//var newDic = dic.OrderBy(t => t.Key).ToDictionary(o => o.Key, p => p.Value);
//参数信息
param = StringHelper.GetPars(dic);
//加密
var paramEncryption = new CCBPayUtil().makeCCBParam(param, StaticPayInfo.pubKey);
//拼接请求串
url = host + Info + "&ccbParam=" + paramEncryption;
//请求
_logger.LogInformation($"请求地址->{url}");
_logger.LogInformation($"请求参数->{param}");
//转换数据
PayResultModel payResult;
try
{
returnData = await HttpHelper.PostAsync(url);
_logger.LogInformation($"响应数据->{returnData}");
}
catch (Exception ex)
{
_logger.LogInformation($"异常信息:{ex.Message}");
_logger.LogInformation($"异常堆栈:{ex.StackTrace}");
return await PayCheck(payModel, ++times);
}
try
{
payResult = JsonHelper.ParseFormByJson<PayResultModel>(returnData);
}
catch
{
payResult = new PayResultModel { RESULT = "N", ERRMSG = "参数错误", ORDERID = payModel.ORDERID, AMOUNT = payModel.AMOUNT };
}
switch (payResult.RESULT)
{
case "Y":
Dictionary<string, object> dicCheckPars = new Dictionary<string, object>();
dicCheckPars.Add("RESULT", payResult.RESULT);
dicCheckPars.Add("ORDERID", payResult.ORDERID);
dicCheckPars.Add("AMOUNT", payResult.AMOUNT);
dicCheckPars.Add("WAITTIME", payResult.WAITTIME);
string strCheckPars = StringHelper.GetPars(dicCheckPars);
if (NotifyCheck(strCheckPars, payResult.SIGN, StaticPayInfo.pubKey))
{
messageModel.Success = true;
messageModel.Message = "支付成功";
}
else
{
messageModel.Success = false;
messageModel.Message = "签名失败";
}
break;
case "N":
messageModel.Success = false;
messageModel.Message = "支付失败";
break;
case "U":
case "Q":
int waittime = payResult.WAITTIME.ObjToInt();
if (waittime <= 0) waittime = 5;//如果需要等待默认等待5秒后再次查询
Thread.Sleep(waittime * 1000);
//改成轮询查询
messageModel = await PayCheck(payModel, ++times);
break;
default:
messageModel.Success = false;
messageModel.Message = "支付失败";
break;
}
messageModel.Data.ORDERID = payResult.ORDERID;
messageModel.Data.ERRCODE = payResult.ERRCODE;
messageModel.Data.ERRMSG = payResult.ERRMSG;
messageModel.Data.TRACEID = payResult.TRACEID;
messageModel.Data.AMOUNT = payResult.AMOUNT;
messageModel.Data.QRCODETYPE = payResult.QRCODETYPE;
}
catch (Exception ex)
{
messageModel.Success = false;
messageModel.Message = "服务错误";
messageModel.Data.ERRMSG = ex.Message;
_logger.LogInformation($"异常信息:{ex.Message}");
_logger.LogInformation($"异常堆栈:{ex.StackTrace}");
}
finally
{
_logger.LogInformation($"返回数据->{JsonHelper.GetJSON<ServiceResult<PayReturnResultModel>>(messageModel)}");
_logger.LogInformation("轮序结束");
}
return messageModel;
}
public bool NotifyCheck(string strSrc, string sign, string pubKey)
{
return new CCBPayUtil().verifyNotifySign(strSrc, sign, pubKey);
}
}

@ -1,16 +1,14 @@
using Microsoft.Extensions.Logging;
using static Tiobon.Core.Model.Consts;
using static Tiobon.Core.Model.Consts;
namespace Tiobon.Core.Services;
public partial class ReportServices : BaseServices<Ghrh_Resume, Ghrh_ResumeDto, InsertGhrh_ResumeInput, EditGhrh_ResumeInput>, IReportServices
{
IHttpContextAccessor _httpContextAccessor;
ILogger<PayServices> _logger;
private readonly IGhra_StaffServices _staffServices;
public ReportServices(ILogger<PayServices> logger, IHttpContextAccessor httpContextAccessor, ICaching caching = null, IGhra_StaffServices staffServices = null)
public ReportServices(IHttpContextAccessor httpContextAccessor, ICaching caching = null, IGhra_StaffServices staffServices = null)
{
_logger = logger;
_httpContextAccessor = httpContextAccessor;
_caching = caching;
_staffServices = staffServices;

@ -1,56 +0,0 @@
using Microsoft.Extensions.Hosting;
using Tiobon.Core.Common;
using Tiobon.Core.IServices;
namespace Tiobon.Core.Tasks;
public class Job1TimedService : IHostedService, IDisposable
{
private Timer _timer;
private readonly ITiobonArticleServices _TiobonArticleServices;
// 这里可以注入
public Job1TimedService(ITiobonArticleServices TiobonArticleServices)
{
_TiobonArticleServices = TiobonArticleServices;
}
public Task StartAsync(CancellationToken cancellationToken)
{
Console.WriteLine("Job 1 is starting.");
_timer = new Timer(DoWork, null, TimeSpan.Zero,
TimeSpan.FromSeconds(60 * 60));//一个小时
return Task.CompletedTask;
}
private void DoWork(object state)
{
try
{
var model = _TiobonArticleServices.GetTiobonDetails(1).Result;
Console.WriteLine($"Job 1 启动成功,获取id=1的博客title为:{model?.btitle}");
}
catch (Exception ex)
{
Console.WriteLine($"Error:{ex.Message}");
}
ConsoleHelper.WriteSuccessLine($"Job 1: {DateTime.Now}");
}
public Task StopAsync(CancellationToken cancellationToken)
{
Console.WriteLine("Job 1 is stopping.");
_timer?.Change(Timeout.Infinite, 0);
return Task.CompletedTask;
}
public void Dispose()
{
_timer?.Dispose();
}
}

@ -1,43 +0,0 @@
using Microsoft.Extensions.Hosting;
using Tiobon.Core.Common;
namespace Tiobon.Core.Tasks;
public class Job2TimedService : IHostedService, IDisposable
{
private Timer _timer;
// 这里可以注入
public Job2TimedService()
{
}
public Task StartAsync(CancellationToken cancellationToken)
{
Console.WriteLine("Job 2 is starting.");
_timer = new Timer(DoWork, null, TimeSpan.Zero,
TimeSpan.FromSeconds(60 * 60 * 2));//两个小时
return Task.CompletedTask;
}
private void DoWork(object state)
{
ConsoleHelper.WriteWarningLine($"Job 2: {DateTime.Now}");
}
public Task StopAsync(CancellationToken cancellationToken)
{
Console.WriteLine("Job 2 is stopping.");
_timer?.Change(Timeout.Infinite, 0);
return Task.CompletedTask;
}
public void Dispose()
{
_timer?.Dispose();
}
}

@ -1,140 +0,0 @@
using Microsoft.AspNetCore.Hosting;
using Newtonsoft.Json;
using Quartz;
using System.Text;
using Tiobon.Core.Common.LogHelper;
using Tiobon.Core.IServices;
using Tiobon.Core.Model.Models;
/// <summary>
/// 这里要注意下,命名空间和程序集是一样的,不然反射不到
/// </summary>
namespace Tiobon.Core.Tasks;
public class Job_AccessTrendLog_Quartz : JobBase, IJob
{
private readonly IAccessTrendLogServices _accessTrendLogServices;
private readonly IWebHostEnvironment _environment;
public Job_AccessTrendLog_Quartz(IAccessTrendLogServices accessTrendLogServices, IWebHostEnvironment environment, ITasksQzServices tasksQzServices, ITasksLogServices tasksLogServices)
: base(tasksQzServices, tasksLogServices)
{
_accessTrendLogServices = accessTrendLogServices;
_environment = environment;
_tasksQzServices = tasksQzServices;
}
public async Task Execute(IJobExecutionContext context)
{
var executeLog = await ExecuteJob(context, async () => await Run(context));
}
public async Task Run(IJobExecutionContext context)
{
// 可以直接获取 JobDetail 的值
var jobKey = context.JobDetail.Key;
var jobId = jobKey.Name;
// 也可以通过数据库配置,获取传递过来的参数
JobDataMap data = context.JobDetail.JobDataMap;
var lastestLogDatetime = (await _accessTrendLogServices.Query(null, d => d.UpdateTime, false)).FirstOrDefault()?.UpdateTime;
if (lastestLogDatetime == null)
{
lastestLogDatetime = Convert.ToDateTime("2021-09-01");
}
var accLogs = GetAccessLogs().Where(d => d.User != "" && d.BeginTime.ObjToDate() >= lastestLogDatetime).ToList();
var logUpdate = DateTime.Now;
var activeUsers = (from n in accLogs
group n by new { n.User } into g
select new ActiveUserVM
{
user = g.Key.User,
count = g.Count(),
}).ToList();
foreach (var item in activeUsers)
{
var user = (await _accessTrendLogServices.Query(d => d.UserInfo != "" && d.UserInfo == item.user)).FirstOrDefault();
if (user != null)
{
user.Count += item.count;
user.UpdateTime = logUpdate;
await _accessTrendLogServices.Update(user);
}
else
{
await _accessTrendLogServices.Add(new AccessTrendLog()
{
Count = item.count,
UpdateTime = logUpdate,
UserInfo = item.user
});
}
}
// 重新拉取
var actUsers = await _accessTrendLogServices.Query(d => d.UserInfo != "", d => d.Count, false);
actUsers = actUsers.Take(15).ToList();
List<ActiveUserVM> activeUserVMs = new();
foreach (var item in actUsers)
{
activeUserVMs.Add(new ActiveUserVM()
{
user = item.UserInfo,
count = item.Count
});
}
Parallel.For(0, 1, e =>
{
LogLock.OutLogAOP("ACCESSTRENDLOG", "", new string[] { activeUserVMs.GetType().ToString(), JsonConvert.SerializeObject(activeUserVMs) }, false);
});
}
private List<UserAccessFromFIles> GetAccessLogs()
{
List<UserAccessFromFIles> userAccessModels = new();
var accessLogs = LogLock.ReadLog(
Path.Combine(_environment.ContentRootPath, "Log"), "RecordAccessLogs_", Encoding.UTF8, ReadType.Prefix, 2
).ObjToString().TrimEnd(',');
try
{
return JsonConvert.DeserializeObject<List<UserAccessFromFIles>>("[" + accessLogs + "]");
}
catch (Exception)
{
var accLogArr = accessLogs.Split("\n");
foreach (var item in accLogArr)
{
if (item.ObjToString() != "")
{
try
{
var accItem = JsonConvert.DeserializeObject<UserAccessFromFIles>(item.TrimEnd(','));
userAccessModels.Add(accItem);
}
catch (Exception)
{
}
}
}
}
return userAccessModels;
}
}
public class UserAccessFromFIles
{
public string User { get; set; }
public string IP { get; set; }
public string API { get; set; }
public string BeginTime { get; set; }
public string OPTime { get; set; }
public string RequestMethod { get; set; } = "";
public string Agent { get; set; }
}
Loading…
Cancel
Save