😎1、优化微信支付相关代码 2、修复代码生成字典映射 3、升级依赖 4、修复清理在线用户逻辑
This commit is contained in:
parent
59ff313d39
commit
03ff581e2f
@ -20,9 +20,9 @@
|
|||||||
<PackageReference Include="AspNetCoreRateLimit" Version="5.0.0" />
|
<PackageReference Include="AspNetCoreRateLimit" Version="5.0.0" />
|
||||||
<PackageReference Include="BouncyCastle.Cryptography" Version="2.5.1" Aliases="BouncyCastleV2" />
|
<PackageReference Include="BouncyCastle.Cryptography" Version="2.5.1" Aliases="BouncyCastleV2" />
|
||||||
<PackageReference Include="Elastic.Clients.Elasticsearch" Version="8.17.1" />
|
<PackageReference Include="Elastic.Clients.Elasticsearch" Version="8.17.1" />
|
||||||
<PackageReference Include="Furion.Extras.Authentication.JwtBearer" Version="4.9.7.10" />
|
<PackageReference Include="Furion.Extras.Authentication.JwtBearer" Version="4.9.7.13" />
|
||||||
<PackageReference Include="Furion.Extras.ObjectMapper.Mapster" Version="4.9.7.10" />
|
<PackageReference Include="Furion.Extras.ObjectMapper.Mapster" Version="4.9.7.13" />
|
||||||
<PackageReference Include="Furion.Pure" Version="4.9.7.10" />
|
<PackageReference Include="Furion.Pure" Version="4.9.7.13" />
|
||||||
<PackageReference Include="Hardware.Info" Version="101.0.1" />
|
<PackageReference Include="Hardware.Info" Version="101.0.1" />
|
||||||
<PackageReference Include="Hashids.net" Version="1.7.0" />
|
<PackageReference Include="Hashids.net" Version="1.7.0" />
|
||||||
<PackageReference Include="IPTools.China" Version="1.6.0" />
|
<PackageReference Include="IPTools.China" Version="1.6.0" />
|
||||||
@ -48,7 +48,7 @@
|
|||||||
<PackageReference Include="SSH.NET" Version="2024.2.0" />
|
<PackageReference Include="SSH.NET" Version="2024.2.0" />
|
||||||
<PackageReference Include="System.Linq.Dynamic.Core" Version="1.6.0.2" />
|
<PackageReference Include="System.Linq.Dynamic.Core" Version="1.6.0.2" />
|
||||||
<PackageReference Include="System.Net.Http" Version="4.3.4" />
|
<PackageReference Include="System.Net.Http" Version="4.3.4" />
|
||||||
<PackageReference Include="TencentCloudSDK.Sms" Version="3.0.1184" />
|
<PackageReference Include="TencentCloudSDK.Sms" Version="3.0.1186" />
|
||||||
<PackageReference Include="UAParser" Version="3.1.47" />
|
<PackageReference Include="UAParser" Version="3.1.47" />
|
||||||
<PackageReference Include="Yitter.IdGenerator" Version="1.0.14" />
|
<PackageReference Include="Yitter.IdGenerator" Version="1.0.14" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|||||||
@ -18,21 +18,21 @@ public class SysWechatRefund : EntityBase
|
|||||||
/// 微信支付订单号(原支付交易对应的微信订单号)
|
/// 微信支付订单号(原支付交易对应的微信订单号)
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[SugarColumn(ColumnDescription = "微信支付订单号", Length = 32)]
|
[SugarColumn(ColumnDescription = "微信支付订单号", Length = 32)]
|
||||||
[Required]
|
[Required]
|
||||||
public string TransactionId { get; set; }
|
public string TransactionId { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 商户订单号(原交易对应的商户付款单号)
|
/// 商户订单号(原交易对应的商户付款单号)
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[SugarColumn(ColumnDescription = "商户付款单号", Length = 32)]
|
[SugarColumn(ColumnDescription = "商户付款单号", Length = 32)]
|
||||||
[Required]
|
[Required]
|
||||||
public string OutTradeNumber { get; set; }
|
public string OutTradeNumber { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 商户系统内部的退款单号,商户系统内部唯一,只能是数字、大小写字母_-|*@ ,同一退款单号多次请求只退一笔。
|
/// 商户系统内部的退款单号,商户系统内部唯一,只能是数字、大小写字母_-|*@ ,同一退款单号多次请求只退一笔。
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[SugarColumn(ColumnDescription = "商户退款单号", Length = 64)]
|
[SugarColumn(ColumnDescription = "商户退款单号", Length = 64)]
|
||||||
[Required]
|
[Required]
|
||||||
public string OutRefundNumber { get; set; }
|
public string OutRefundNumber { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@ -43,43 +43,43 @@ public class SysWechatRefund : EntityBase
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// 退款原因,示例:商品已售完
|
/// 退款原因,示例:商品已售完
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[SugarColumn(ColumnDescription = "退款原因", Length = 80)]
|
[SugarColumn(ColumnDescription = "退款原因", Length = 80)]
|
||||||
public string Reason { get; set; }
|
public string Reason { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 退款金额
|
/// 退款金额
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[SugarColumn(ColumnDescription = "退款金额")]
|
[SugarColumn(ColumnDescription = "退款金额")]
|
||||||
public int Refund { get; set; }
|
public int Refund { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 原订单总金额
|
/// 原订单总金额
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[SugarColumn(ColumnDescription = "订单总金额")]
|
[SugarColumn(ColumnDescription = "订单总金额")]
|
||||||
public int Total { get; set; }
|
public int Total { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 退款结果回调url
|
/// 退款结果回调url
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[SugarColumn(ColumnDescription = "退款结果回调url", Length = 256)]
|
[SugarColumn(ColumnDescription = "退款结果回调url", Length = 256)]
|
||||||
public string? NotifyUrl { get; set; }
|
public string? NotifyUrl { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 退款资金来源, 可不传,默认使用未结算资金退款(仅对老资金流商户适用)
|
/// 退款资金来源, 可不传,默认使用未结算资金退款(仅对老资金流商户适用)
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[SugarColumn(ColumnDescription = "退款资金来源", Length = 32)]
|
[SugarColumn(ColumnDescription = "退款资金来源", Length = 32)]
|
||||||
public string? FundsAccount { get; set; }
|
public string? FundsAccount { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 关联的商户订单号
|
/// 关联的商户订单号
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[SugarColumn(ColumnDescription = "关联的用户订单号", Length = 256)]
|
[SugarColumn(ColumnDescription = "关联的用户订单号", Length = 256)]
|
||||||
public string? OrderId { get; set; }
|
public string? OrderId { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 关联的商户订单状态(或者为第几次支付,有些订单涉及多次支付,比如先付预付款,后补尾款)
|
/// 关联的商户订单状态(或者为第几次支付,有些订单涉及多次支付,比如先付预付款,后补尾款)
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[SugarColumn(ColumnDescription = "关联的商户订单状态", Length = 32)]
|
[SugarColumn(ColumnDescription = "关联的商户订单状态", Length = 32)]
|
||||||
public string? RefundStatus { get; set; }
|
public string? RefundStatus { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@ -91,42 +91,42 @@ public class SysWechatRefund : EntityBase
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// 关联的商户商品编码
|
/// 关联的商户商品编码
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[SugarColumn(ColumnDescription = "关联的商户商品编码", Length = 32)]
|
[SugarColumn(ColumnDescription = "关联的商户商品编码", Length = 32)]
|
||||||
public string? MerchantGoodsId { get; set; }
|
public string? MerchantGoodsId { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 关联的商户商品名称
|
/// 关联的商户商品名称
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[SugarColumn(ColumnDescription = "关联的商户商品名称", Length = 256)]
|
[SugarColumn(ColumnDescription = "关联的商户商品名称", Length = 256)]
|
||||||
public string? GoodsName { get; set; }
|
public string? GoodsName { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 关联的商户商品单价
|
/// 关联的商户商品单价
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[SugarColumn(ColumnDescription = "关联的商户商品单价")]
|
[SugarColumn(ColumnDescription = "关联的商户商品单价")]
|
||||||
public int UnitPrice { get; set; }
|
public int UnitPrice { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 关联的商户商品退款金额
|
/// 关联的商户商品退款金额
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[SugarColumn(ColumnDescription = "关联的商户商品退款金额")]
|
[SugarColumn(ColumnDescription = "关联的商户商品退款金额")]
|
||||||
public int RefundAmount { get; set; }
|
public int RefundAmount { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 关联的商户商品退货数量
|
/// 关联的商户商品退货数量
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[SugarColumn(ColumnDescription = "关联的商户商品退货数量")]
|
[SugarColumn(ColumnDescription = "关联的商户商品退货数量")]
|
||||||
public int RefundQuantity { get; set; } = 1;
|
public int RefundQuantity { get; set; } = 1;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 附加数据
|
/// 附加数据
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[SugarColumn(ColumnDescription = "附加数据")]
|
[SugarColumn(ColumnDescription = "附加数据")]
|
||||||
public string? Attachment { get; set; }
|
public string? Attachment { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 备注
|
/// 备注
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[SugarColumn(ColumnDescription = "备注", ColumnDataType = StaticConfig.CodeFirst_BigString)]
|
[SugarColumn(ColumnDescription = "备注", ColumnDataType = StaticConfig.CodeFirst_BigString)]
|
||||||
public string? Remark { get; set; }
|
public string? Remark { get; set; }
|
||||||
}
|
}
|
||||||
@ -116,7 +116,7 @@ public class SysOnlineUserService : IDynamicApiController, ITransient
|
|||||||
[DisplayName("清理在线用户")]
|
[DisplayName("清理在线用户")]
|
||||||
public async Task ClearOnline()
|
public async Task ClearOnline()
|
||||||
{
|
{
|
||||||
if (await _sysConfigService.GetConfigValueByCode<bool>(ConfigConst.SysSingleLogin)) return;
|
if (!await _sysConfigService.GetConfigValueByCode<bool>(ConfigConst.SysSingleLogin)) return;
|
||||||
|
|
||||||
// 相同账号最后登录的用户Id集合
|
// 相同账号最后登录的用户Id集合
|
||||||
var onlineUsers = await _sysOnlineUerRep.AsQueryable().GroupBy(u => u.UserId)
|
var onlineUsers = await _sysOnlineUerRep.AsQueryable().GroupBy(u => u.UserId)
|
||||||
|
|||||||
@ -15,7 +15,7 @@ namespace Admin.NET.Core.Service;
|
|||||||
[ApiDescriptionSettings(Order = 210, Description = "微信支付")]
|
[ApiDescriptionSettings(Order = 210, Description = "微信支付")]
|
||||||
public class SysWechatPayService : IDynamicApiController, ITransient
|
public class SysWechatPayService : IDynamicApiController, ITransient
|
||||||
{
|
{
|
||||||
private static List<WechatPayEventInterceptor> wechatPayEventHandlers = new List<WechatPayEventInterceptor>();
|
private static readonly List<WechatPayEventInterceptor> wechatPayEventHandlers = [new WechatPayEventInterceptor() { Order = int.MaxValue }];
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 注册支付记录变化事件处理器
|
/// 注册支付记录变化事件处理器
|
||||||
@ -42,7 +42,7 @@ public class SysWechatPayService : IDynamicApiController, ITransient
|
|||||||
IOptions<PayCallBackOptions> payCallBackOptions)
|
IOptions<PayCallBackOptions> payCallBackOptions)
|
||||||
{
|
{
|
||||||
_sysWechatPayRep = sysWechatPayRep;
|
_sysWechatPayRep = sysWechatPayRep;
|
||||||
this._sysWechatRefundRep = sysWechatRefundRep;
|
_sysWechatRefundRep = sysWechatRefundRep;
|
||||||
_wechatPayOptions = wechatPayOptions.Value;
|
_wechatPayOptions = wechatPayOptions.Value;
|
||||||
_payCallBackOptions = payCallBackOptions.Value;
|
_payCallBackOptions = payCallBackOptions.Value;
|
||||||
|
|
||||||
@ -201,7 +201,7 @@ public class SysWechatPayService : IDynamicApiController, ITransient
|
|||||||
{
|
{
|
||||||
string outTradeNumber = DateTimeOffset.Now.ToString("yyyyMMddHHmmssfff") + (new Random()).Next(100, 1000); // 微信需要的订单号(唯一)
|
string outTradeNumber = DateTimeOffset.Now.ToString("yyyyMMddHHmmssfff") + (new Random()).Next(100, 1000); // 微信需要的订单号(唯一)
|
||||||
|
|
||||||
//检查订单信息是否已存在(使用“商户交易单号+状态”唯一性判断)
|
// 检查订单信息是否已存在(使用“商户交易单号+状态”唯一性判断)
|
||||||
var wechatPay = await _sysWechatPayRep.GetFirstAsync(u => u.OrderId == input.OrderId && u.OrderStatus == input.OrderStatus);
|
var wechatPay = await _sysWechatPayRep.GetFirstAsync(u => u.OrderId == input.OrderId && u.OrderStatus == input.OrderStatus);
|
||||||
if (wechatPay != null)
|
if (wechatPay != null)
|
||||||
{
|
{
|
||||||
@ -299,11 +299,11 @@ public class SysWechatPayService : IDynamicApiController, ITransient
|
|||||||
wechatPayNew.SuccessTime = response.SuccessTime.Value.DateTime; // 支付完成时间
|
wechatPayNew.SuccessTime = response.SuccessTime.Value.DateTime; // 支付完成时间
|
||||||
else
|
else
|
||||||
wechatPayNew.SuccessTime = DateTime.Now;
|
wechatPayNew.SuccessTime = DateTime.Now;
|
||||||
await _sysWechatPayRep.AsUpdateable(wechatPayNew).IgnoreColumns(true).ExecuteCommandAsync();
|
await _sysWechatPayRep.AsUpdateable(wechatPayNew).IgnoreColumns(true).ExecuteCommandAsync();
|
||||||
}
|
}
|
||||||
if (wechatPayOld == null || wechatPayOld.TradeState!=wechatPayNew.TradeState)
|
if (wechatPayOld == null || wechatPayOld.TradeState != wechatPayNew.TradeState)
|
||||||
{
|
{
|
||||||
//没必要等所有回调事件处理完再返回给微信,开一个Task执行
|
// 没必要等所有回调事件处理完再返回给微信,开一个Task执行
|
||||||
Task.Run(async () =>
|
Task.Run(async () =>
|
||||||
{
|
{
|
||||||
foreach (var eh in wechatPayEventHandlers)
|
foreach (var eh in wechatPayEventHandlers)
|
||||||
@ -334,9 +334,9 @@ public class SysWechatPayService : IDynamicApiController, ITransient
|
|||||||
TradeState = response.TradeState, // 交易状态
|
TradeState = response.TradeState, // 交易状态
|
||||||
TradeStateDescription = response.TradeStateDescription, // 交易状态描述
|
TradeStateDescription = response.TradeStateDescription, // 交易状态描述
|
||||||
BankType = response.BankType, // 付款银行类型
|
BankType = response.BankType, // 付款银行类型
|
||||||
SuccessTime = response.SuccessTime.HasValue ? response.SuccessTime.Value.DateTime : DateTime.Now // 支付完成时间
|
SuccessTime = response.SuccessTime.HasValue ? response.SuccessTime.Value.DateTime : DateTime.Now // 支付完成时间
|
||||||
};
|
};
|
||||||
|
|
||||||
return wechatPayNew;
|
return wechatPayNew;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -363,7 +363,7 @@ public class SysWechatPayService : IDynamicApiController, ITransient
|
|||||||
&& u.MerchantId == callbackResource.MerchantId);
|
&& u.MerchantId == callbackResource.MerchantId);
|
||||||
if (wechatPayOld == null) return null;
|
if (wechatPayOld == null) return null;
|
||||||
var wechatPayNew = wechatPayOld.DeepCopy();
|
var wechatPayNew = wechatPayOld.DeepCopy();
|
||||||
if (callbackResource.Payer!=null)
|
if (callbackResource.Payer != null)
|
||||||
wechatPayNew.OpenId = callbackResource.Payer.OpenId; // 支付者标识
|
wechatPayNew.OpenId = callbackResource.Payer.OpenId; // 支付者标识
|
||||||
wechatPayNew.TransactionId = callbackResource.TransactionId; // 支付订单号
|
wechatPayNew.TransactionId = callbackResource.TransactionId; // 支付订单号
|
||||||
wechatPayNew.TradeType = callbackResource.TradeType; // 交易类型
|
wechatPayNew.TradeType = callbackResource.TradeType; // 交易类型
|
||||||
@ -375,7 +375,7 @@ public class SysWechatPayService : IDynamicApiController, ITransient
|
|||||||
wechatPayNew.SuccessTime = callbackResource.SuccessTime; // 支付完成时间
|
wechatPayNew.SuccessTime = callbackResource.SuccessTime; // 支付完成时间
|
||||||
|
|
||||||
await _sysWechatPayRep.AsUpdateable(wechatPayNew).IgnoreColumns(true).ExecuteCommandAsync();
|
await _sysWechatPayRep.AsUpdateable(wechatPayNew).IgnoreColumns(true).ExecuteCommandAsync();
|
||||||
//因为这个是回调给微信的,所以这里没必要等所有回调事件处理完再返回给微信,开一个Task执行
|
// 因为这个是回调给微信的,所以这里没必要等所有回调事件处理完再返回给微信,开一个Task执行
|
||||||
if (wechatPayOld.TradeState != wechatPayNew.TradeState)
|
if (wechatPayOld.TradeState != wechatPayNew.TradeState)
|
||||||
{
|
{
|
||||||
Task.Run(async () =>
|
Task.Run(async () =>
|
||||||
@ -422,7 +422,7 @@ public class SysWechatPayService : IDynamicApiController, ITransient
|
|||||||
var callbackModel = _wechatTenpayClient.DeserializeEvent(callbackJson);
|
var callbackModel = _wechatTenpayClient.DeserializeEvent(callbackJson);
|
||||||
if ("REFUND.SUCCESS".Equals(callbackModel.EventType))
|
if ("REFUND.SUCCESS".Equals(callbackModel.EventType))
|
||||||
{
|
{
|
||||||
//参考:https://pay.weixin.qq.com/docs/merchant/apis/jsapi-payment/refund-result-notice.html
|
// 参考:https://pay.weixin.qq.com/docs/merchant/apis/jsapi-payment/refund-result-notice.html
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var callbackRefundResource = _wechatTenpayClient.DecryptEventResource<RefundResource>(callbackModel);
|
var callbackRefundResource = _wechatTenpayClient.DecryptEventResource<RefundResource>(callbackModel);
|
||||||
@ -487,7 +487,7 @@ public class SysWechatPayService : IDynamicApiController, ITransient
|
|||||||
wechatPayNew.SuccessTime = callbackResource.SuccessTime; // 支付完成时间
|
wechatPayNew.SuccessTime = callbackResource.SuccessTime; // 支付完成时间
|
||||||
|
|
||||||
await _sysWechatPayRep.AsUpdateable(wechatPayNew).IgnoreColumns(true).ExecuteCommandAsync();
|
await _sysWechatPayRep.AsUpdateable(wechatPayNew).IgnoreColumns(true).ExecuteCommandAsync();
|
||||||
//因为这个是回调给微信的,所以这里没必要等所有回调事件处理完再返回给微信,开一个Task执行
|
// 因为这个是回调给微信的,所以这里没必要等所有回调事件处理完再返回给微信,开一个Task执行
|
||||||
if (wechatPayOld.TradeState != wechatPayNew.TradeState)
|
if (wechatPayOld.TradeState != wechatPayNew.TradeState)
|
||||||
{
|
{
|
||||||
Task.Run(async () =>
|
Task.Run(async () =>
|
||||||
@ -519,7 +519,7 @@ public class SysWechatPayService : IDynamicApiController, ITransient
|
|||||||
public async Task Refund(RefundRequestInput input)
|
public async Task Refund(RefundRequestInput input)
|
||||||
{
|
{
|
||||||
var vechatPay = await _sysWechatPayRep.GetFirstAsync(u => u.OutTradeNumber == input.OutTradeNumber);
|
var vechatPay = await _sysWechatPayRep.GetFirstAsync(u => u.OutTradeNumber == input.OutTradeNumber);
|
||||||
if (vechatPay==null)
|
if (vechatPay == null)
|
||||||
{
|
{
|
||||||
throw Oops.Bah("没有相应支付记录");
|
throw Oops.Bah("没有相应支付记录");
|
||||||
}
|
}
|
||||||
@ -723,11 +723,11 @@ public class SysWechatPayService : IDynamicApiController, ITransient
|
|||||||
/// <param name="outTradeNumber"><</param>
|
/// <param name="outTradeNumber"><</param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
[DisplayName("根据支付Id获取退款信息列表")]
|
[DisplayName("根据支付Id获取退款信息列表")]
|
||||||
public async Task<List<SysWechatRefund>> GetRefundList([FromQuery] string transactionId, [FromQuery] string outTradeNumber )
|
public async Task<List<SysWechatRefund>> GetRefundList([FromQuery] string transactionId, [FromQuery] string outTradeNumber)
|
||||||
{
|
{
|
||||||
return await _sysWechatRefundRep.AsQueryable()
|
return await _sysWechatRefundRep.AsQueryable()
|
||||||
.WhereIF(!string.IsNullOrEmpty(transactionId), u => u.TransactionId == transactionId)
|
.WhereIF(!string.IsNullOrEmpty(transactionId), u => u.TransactionId == transactionId)
|
||||||
.WhereIF(!string.IsNullOrEmpty(outTradeNumber), u=> u.OutTradeNumber == outTradeNumber)
|
.WhereIF(!string.IsNullOrEmpty(outTradeNumber), u => u.OutTradeNumber == outTradeNumber)
|
||||||
.ToListAsync();
|
.ToListAsync();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1,37 +1,30 @@
|
|||||||
// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。
|
// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。
|
||||||
//
|
//
|
||||||
// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。
|
// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。
|
||||||
//
|
//
|
||||||
// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
|
// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
|
||||||
|
|
||||||
using System;
|
namespace Admin.NET.Core.Service;
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
/// <summary>
|
||||||
using System.Text;
|
/// 微信支传订单状态变化事件拦截器
|
||||||
using System.Threading.Tasks;
|
/// </summary>
|
||||||
|
public class WechatPayEventInterceptor
|
||||||
namespace Admin.NET.Core;
|
{
|
||||||
|
/// <summary>
|
||||||
/// <summary>
|
/// 数值越大越先执行
|
||||||
/// 微信支传订单状态变化事件拦截器
|
/// </summary>
|
||||||
/// </summary>
|
public int Order = 0;
|
||||||
public class WechatPayEventInterceptor
|
|
||||||
{
|
/// <summary>
|
||||||
/// <summary>
|
/// 信息变化处理器
|
||||||
/// 排序,数据越大越先执行
|
/// </summary>
|
||||||
/// </summary>
|
/// <remarks>主要用来判断 TradeStatus 的状态,这个状态有"空",NOTPAY,SUCCESS, REFUND</remarks>
|
||||||
public int Order = 0;
|
/// <param name="oldInfo">旧记录状态</param>
|
||||||
|
/// <param name="newInfo">新记录状态</param>
|
||||||
/// <summary>
|
/// <returns></returns>
|
||||||
/// 信息变化处理器
|
public virtual async Task<bool> PayInforChanged(SysWechatPay oldInfo, SysWechatPay newInfo)
|
||||||
/// </summary>
|
{
|
||||||
/// <remarks>主要用来判断 TradeStatus 的状态,这个状态有"空",NOTPAY,SUCCESS, REFUND</remarks>
|
return await Task.FromResult(true);
|
||||||
/// <param name="oldInfo">旧记录状态</param>
|
}
|
||||||
/// <param name="newInfo">新记录状态</param>
|
}
|
||||||
/// <returns></returns>
|
|
||||||
public virtual async Task<bool> PayInforChanged(SysWechatPay oldInfo, SysWechatPay newInfo)
|
|
||||||
{
|
|
||||||
return await Task.FromResult<bool>(true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@ -253,9 +253,6 @@ public class Startup : AppStartup
|
|||||||
// 注册启动执行任务
|
// 注册启动执行任务
|
||||||
services.AddHostedService<StartHostedService>();
|
services.AddHostedService<StartHostedService>();
|
||||||
services.AddHostedService<MqttHostedService>();
|
services.AddHostedService<MqttHostedService>();
|
||||||
|
|
||||||
// 下面代码演示,引入自己的微信息支付信息变化事件处理器
|
|
||||||
Admin.NET.Core.Service.SysWechatPayService.AddPayEventInterceptor(new WechatPayEventInterceptor(), int.MaxValue);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
|
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
|
||||||
|
|||||||
@ -52,7 +52,7 @@
|
|||||||
<el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6" class="mb5" v-if="state.showAdvanceQueryUI">
|
<el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6" class="mb5" v-if="state.showAdvanceQueryUI">
|
||||||
<el-form-item label="@column.ColumnComment" prop="@(@column.LowerPropertyName)">
|
<el-form-item label="@column.ColumnComment" prop="@(@column.LowerPropertyName)">
|
||||||
<el-select v-model="state.queryParams.@(@column.LowerPropertyName)" filterable placeholder="请选择@(@column.ColumnComment)" clearable @@keyup.enter.native="handleQuery(true)" >
|
<el-select v-model="state.queryParams.@(@column.LowerPropertyName)" filterable placeholder="请选择@(@column.ColumnComment)" clearable @@keyup.enter.native="handleQuery(true)" >
|
||||||
<el-option v-for="(item,index) in dl('@(@column.DictTypeCode)')" :key="index" :value="item.code" :label="`${item.name||''} [${item.code}] ${item.value}`" />
|
<el-option v-for="(item,index) in dl('@(@column.DictTypeCode)')" :key="index" :value="item.value" :label="`${item.label} [${item.code}] ${item.value}`" />
|
||||||
</el-select>
|
</el-select>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
@ -60,7 +60,7 @@
|
|||||||
<el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6" class="mb5" v-if="state.showAdvanceQueryUI">
|
<el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6" class="mb5" v-if="state.showAdvanceQueryUI">
|
||||||
<el-form-item label="@column.ColumnComment" prop="@(@column.LowerPropertyName)">
|
<el-form-item label="@column.ColumnComment" prop="@(@column.LowerPropertyName)">
|
||||||
<el-select v-model="state.queryParams.@(@column.LowerPropertyName)" filterable placeholder="请选择@(@column.ColumnComment)" clearable @@keyup.enter.native="handleQuery(true)" >
|
<el-select v-model="state.queryParams.@(@column.LowerPropertyName)" filterable placeholder="请选择@(@column.ColumnComment)" clearable @@keyup.enter.native="handleQuery(true)" >
|
||||||
<el-option v-for="(item,index) in dl('@(@column.DictTypeCode)')" :key="index" :value="item.value" :label="`${item.name} [${item.code}] ${item.value}`" />
|
<el-option v-for="(item,index) in dl('@(@column.DictTypeCode)')" :key="index" :value="item.value" :label="`${item.label} [${item.code}] ${item.value}`" />
|
||||||
</el-select>
|
</el-select>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
|
|||||||
@ -25,7 +25,7 @@
|
|||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="DocumentFormat.OpenXml" Version="3.2.0" />
|
<PackageReference Include="DocumentFormat.OpenXml" Version="3.2.0" />
|
||||||
<PackageReference Include="Microsoft.CodeAnalysis.CSharp.Scripting" Version="4.12.0" />
|
<PackageReference Include="Microsoft.CodeAnalysis.CSharp.Scripting" Version="4.13.0" />
|
||||||
<PackageReference Include="Rezero.Api" Version="1.7.13" />
|
<PackageReference Include="Rezero.Api" Version="1.7.13" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
|
|||||||
@ -2,7 +2,7 @@
|
|||||||
"name": "admin.net.pro",
|
"name": "admin.net.pro",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"version": "2.4.33",
|
"version": "2.4.33",
|
||||||
"lastBuildTime": "2025.02.23",
|
"lastBuildTime": "2025.02.25",
|
||||||
"description": "Admin.NET 站在巨人肩膀上的 .NET 通用权限开发框架",
|
"description": "Admin.NET 站在巨人肩膀上的 .NET 通用权限开发框架",
|
||||||
"author": "zuohuaijun",
|
"author": "zuohuaijun",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
@ -88,22 +88,22 @@
|
|||||||
"@types/node": "^20.17.19",
|
"@types/node": "^20.17.19",
|
||||||
"@types/nprogress": "^0.2.3",
|
"@types/nprogress": "^0.2.3",
|
||||||
"@types/sortablejs": "^1.15.8",
|
"@types/sortablejs": "^1.15.8",
|
||||||
"@typescript-eslint/eslint-plugin": "^8.24.1",
|
"@typescript-eslint/eslint-plugin": "^8.25.0",
|
||||||
"@typescript-eslint/parser": "^8.24.1",
|
"@typescript-eslint/parser": "^8.25.0",
|
||||||
"@vitejs/plugin-vue": "^5.2.1",
|
"@vitejs/plugin-vue": "^5.2.1",
|
||||||
"@vitejs/plugin-vue-jsx": "^4.1.1",
|
"@vitejs/plugin-vue-jsx": "^4.1.1",
|
||||||
"@vue/compiler-sfc": "^3.5.13",
|
"@vue/compiler-sfc": "^3.5.13",
|
||||||
"code-inspector-plugin": "^0.20.0",
|
"code-inspector-plugin": "^0.20.1",
|
||||||
"eslint": "^9.21.0",
|
"eslint": "^9.21.0",
|
||||||
"eslint-plugin-vue": "^9.32.0",
|
"eslint-plugin-vue": "^9.32.0",
|
||||||
"globals": "^16.0.0",
|
"globals": "^16.0.0",
|
||||||
"less": "^4.2.2",
|
"less": "^4.2.2",
|
||||||
"prettier": "^3.5.2",
|
"prettier": "^3.5.2",
|
||||||
"rollup-plugin-visualizer": "^5.14.0",
|
"rollup-plugin-visualizer": "^5.14.0",
|
||||||
"sass": "^1.85.0",
|
"sass": "^1.85.1",
|
||||||
"terser": "^5.39.0",
|
"terser": "^5.39.0",
|
||||||
"typescript": "^5.7.3",
|
"typescript": "^5.7.3",
|
||||||
"vite": "^6.1.1",
|
"vite": "^6.2.0",
|
||||||
"vite-plugin-cdn-import": "^1.0.1",
|
"vite-plugin-cdn-import": "^1.0.1",
|
||||||
"vite-plugin-compression2": "^1.3.3",
|
"vite-plugin-compression2": "^1.3.3",
|
||||||
"vite-plugin-vue-setup-extend": "^0.4.0",
|
"vite-plugin-vue-setup-extend": "^0.4.0",
|
||||||
|
|||||||
@ -108,6 +108,14 @@ export interface SysWechatRefund {
|
|||||||
*/
|
*/
|
||||||
outRefundNumber: string;
|
outRefundNumber: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 微信接口退款ID
|
||||||
|
*
|
||||||
|
* @type {string}
|
||||||
|
* @memberof SysWechatRefund
|
||||||
|
*/
|
||||||
|
refundId?: string | null;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 退款原因,示例:商品已售完
|
* 退款原因,示例:商品已售完
|
||||||
*
|
*
|
||||||
|
|||||||
@ -47,7 +47,7 @@
|
|||||||
size="small"
|
size="small"
|
||||||
text
|
text
|
||||||
type="primary"
|
type="primary"
|
||||||
v-if="scope.row.qrcodeContent != null && scope.row.qrcodeContent != '' && (scope.row.tradeState === '' || !scope.row.tradeState || scope.row.tradeState=='NOTPAY')"
|
v-if="scope.row.qrcodeContent != null && scope.row.qrcodeContent != '' && (scope.row.tradeState === '' || !scope.row.tradeState || scope.row.tradeState == 'NOTPAY')"
|
||||||
@click="openQrDialog(scope.row.qrcodeContent)"
|
@click="openQrDialog(scope.row.qrcodeContent)"
|
||||||
>
|
>
|
||||||
付款二维码
|
付款二维码
|
||||||
@ -157,22 +157,22 @@ const addData = ref<any>({});
|
|||||||
const ruleFormRef = ref<InstanceType<typeof ElForm>>();
|
const ruleFormRef = ref<InstanceType<typeof ElForm>>();
|
||||||
|
|
||||||
const state = reactive({
|
const state = reactive({
|
||||||
loading: false,
|
loading: false,
|
||||||
tableData: [] as Array<SysWechatPay>,
|
tableData: [] as Array<SysWechatPay>,
|
||||||
queryParams: {
|
queryParams: {
|
||||||
keyword: undefined,
|
keyword: undefined,
|
||||||
createTimeRange: undefined,
|
createTimeRange: undefined,
|
||||||
},
|
},
|
||||||
tableParams: {
|
tableParams: {
|
||||||
page: 1,
|
page: 1,
|
||||||
pageSize: 50,
|
pageSize: 50,
|
||||||
total: 0 as any,
|
total: 0 as any,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
// 页面初始化
|
// 页面初始化
|
||||||
onMounted(async () => {
|
onMounted(async () => {
|
||||||
await handleQuery();
|
await handleQuery();
|
||||||
});
|
});
|
||||||
|
|
||||||
// 查询操作
|
// 查询操作
|
||||||
@ -234,15 +234,15 @@ const openRefundDialog = async (transactionId: string) => {
|
|||||||
|
|
||||||
// 保存数据
|
// 保存数据
|
||||||
const saveData = async () => {
|
const saveData = async () => {
|
||||||
ruleFormRef.value?.validate(async (valid) => {
|
ruleFormRef.value?.validate(async (valid) => {
|
||||||
if (valid) {
|
if (valid) {
|
||||||
var res = await getAPI(SysWechatPayApi).apiSysWechatPayPayTransactionNativePost(addData.value);
|
var res = await getAPI(SysWechatPayApi).apiSysWechatPayPayTransactionNativePost(addData.value);
|
||||||
closeAddDialog();
|
closeAddDialog();
|
||||||
let code = res.data.result?.qrcodeUrl;
|
let code = res.data.result?.qrcodeUrl;
|
||||||
openQrDialog(code == undefined ? '' : code);
|
openQrDialog(code == undefined ? '' : code);
|
||||||
await handleQuery();
|
await handleQuery();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
// 退款
|
// 退款
|
||||||
@ -269,7 +269,7 @@ const doRefund = async (orderInfo: any) => {
|
|||||||
const doRefreshRecord = async (orderInfo: any) => {
|
const doRefreshRecord = async (orderInfo: any) => {
|
||||||
await getAPI(SysWechatPayApi).apiSysWechatPayPayInfoFromWechatTradeIdGet(orderInfo.outTradeNumber);
|
await getAPI(SysWechatPayApi).apiSysWechatPayPayInfoFromWechatTradeIdGet(orderInfo.outTradeNumber);
|
||||||
await handleQuery();
|
await handleQuery();
|
||||||
}
|
};
|
||||||
|
|
||||||
// 数字转换
|
// 数字转换
|
||||||
const amountFormatter = (row: any, column: any, cellValue: number) => {
|
const amountFormatter = (row: any, column: any, cellValue: number) => {
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user