// Admin.NET 项目的版æƒã€å•†æ ‡ã€ä¸“利和其他相关æƒåˆ©å‡å—ç›¸åº”æ³•å¾‹æ³•è§„çš„ä¿æŠ¤ã€‚ä½¿ç”¨æœ¬é¡¹ç›®åº”éµå®ˆç›¸å…³æ³•律法规和许å¯è¯çš„è¦æ±‚。 // // 本项目主è¦éµå¾ª MIT 许å¯è¯å’Œ Apache 许å¯è¯ï¼ˆç‰ˆæœ¬ 2.0)进行分å‘和使用。许å¯è¯ä½äºŽæºä»£ç æ ‘æ ¹ç›®å½•ä¸çš„ LICENSE-MIT å’Œ LICENSE-APACHE 文件。 // // ä¸å¾—利用本项目从事å±å®³å›½å®¶å®‰å…¨ã€æ‰°ä¹±ç¤¾ä¼šç§©åºã€ä¾µçŠ¯ä»–äººåˆæ³•æƒç›Šç‰æ³•å¾‹æ³•è§„ç¦æ¢çš„æ´»åЍï¼ä»»ä½•基于本项目二次开å‘è€Œäº§ç”Ÿçš„ä¸€åˆ‡æ³•å¾‹çº çº·å’Œè´£ä»»ï¼Œæˆ‘ä»¬ä¸æ‰¿æ‹…ä»»ä½•è´£ä»»ï¼ using Furion.Logging.Extensions; using Newtonsoft.Json; namespace Admin.NET.Core.Service; /// <summary> /// 微信支付æœåŠ¡ 🧩 /// </summary> [ApiDescriptionSettings(Order = 210)] public class SysWechatPayService : IDynamicApiController, ITransient { private readonly SqlSugarRepository<SysWechatPay> _sysWechatPayRep; private readonly SqlSugarRepository<SysWechatRefund> _sysWechatRefundRep; private readonly WechatPayOptions _wechatPayOptions; private readonly PayCallBackOptions _payCallBackOptions; private readonly WechatTenpayClient _wechatTenpayClient; public SysWechatPayService(SqlSugarRepository<SysWechatPay> sysWechatPayUserRep, SqlSugarRepository<SysWechatRefund> sysWechatRefundRep, IOptions<WechatPayOptions> wechatPayOptions, IOptions<PayCallBackOptions> payCallBackOptions) { _sysWechatPayRep = sysWechatPayUserRep; _sysWechatRefundRep = sysWechatRefundRep; _wechatPayOptions = wechatPayOptions.Value; _payCallBackOptions = payCallBackOptions.Value; _wechatTenpayClient = CreateTenpayClient(); } /// <summary> /// åˆå§‹åŒ–微信支付客户端 /// </summary> /// <returns></returns> private WechatTenpayClient CreateTenpayClient() { var cerFilePath = App.WebHostEnvironment.ContentRootPath + _wechatPayOptions.MerchantCertificatePrivateKey; var tenpayClientOptions = new WechatTenpayClientOptions() { MerchantId = _wechatPayOptions.MerchantId, MerchantV3Secret = _wechatPayOptions.MerchantV3Secret, MerchantCertificateSerialNumber = _wechatPayOptions.MerchantCertificateSerialNumber, MerchantCertificatePrivateKey = File.Exists(cerFilePath) ? File.ReadAllText(cerFilePath) : "", PlatformCertificateManager = new InMemoryCertificateManager() }; return new WechatTenpayClient(tenpayClientOptions); } /// <summary> /// 分页查询支付列表 🔖 /// </summary> /// <param name="input"></param> /// <returns></returns> [HttpPost] [ApiDescriptionSettings(Name = "Page")] public async Task<SqlSugarPagedList<SysWechatPay>> Page(WechatPayPageInput input) { var query = _sysWechatPayRep.AsQueryable() .WhereIF(!string.IsNullOrWhiteSpace(input.SearchKey), u => u.OutTradeNumber == input.SearchKey || u.TransactionId == input.SearchKey) .WhereIF(input.CreateTimeRange != null && input.CreateTimeRange.Count > 0 && input.CreateTimeRange[0].HasValue, x => x.CreateTime >= input.CreateTimeRange[0]) .WhereIF(input.CreateTimeRange != null && input.CreateTimeRange.Count > 1 && input.CreateTimeRange[1].HasValue, x => x.CreateTime < ((DateTime)input.CreateTimeRange[1]).AddDays(1)); return await query.OrderBuilder(input).ToPagedListAsync(input.Page, input.PageSize); } /// <summary> /// 查询退款信æ¯åˆ—表 /// </summary> /// <param name="id"></param> /// <returns></returns> [HttpPost] [DisplayName("æ ¹æ®æ”¯ä»˜id获å–退款信æ¯åˆ—表")] public async Task<List<SysWechatRefund>> ListRefund([FromBody] string id) { var query = _sysWechatRefundRep.AsQueryable() .Where(u => u.TransactionId == id); return await query.ToListAsync(); } /// <summary> /// 生æˆJSAPIè°ƒèµ·æ”¯ä»˜æ‰€éœ€å‚æ•° 🔖 /// </summary> /// <param name="input"></param> /// <returns></returns> [DisplayName("生æˆJSAPIè°ƒèµ·æ”¯ä»˜æ‰€éœ€å‚æ•°")] public WechatPayParaOutput GenerateParametersForJsapiPay(WechatPayParaInput input) { var data = _wechatTenpayClient.GenerateParametersForJsapiPayRequest(_wechatPayOptions.AppId, input.PrepayId); return new WechatPayParaOutput() { AppId = data["appId"], TimeStamp = data["timeStamp"], NonceStr = data["nonceStr"], Package = data["package"], SignType = data["signType"], PaySign = data["paySign"] }; } /// <summary> /// 微信支付下å•(商户直连) 🔖 /// </summary> [DisplayName("微信支付下å•(商户直连)")] public async Task<WechatPayTransactionOutput> CreatePayTransaction([FromBody] WechatPayTransactionInput input) { var request = new CreatePayTransactionJsapiRequest() { OutTradeNumber = DateTimeOffset.Now.ToString("yyyyMMddHHmmssfff") + (new Random()).Next(100, 1000), // 订å•å· AppId = _wechatPayOptions.AppId, Description = input.Description, Attachment = input.Attachment, GoodsTag = input.GoodsTag, ExpireTime = DateTimeOffset.Now.AddMinutes(10), NotifyUrl = _payCallBackOptions.WechatPayUrl, Amount = new CreatePayTransactionJsapiRequest.Types.Amount() { Total = input.Total }, Payer = new CreatePayTransactionJsapiRequest.Types.Payer() { OpenId = input.OpenId } }; var response = await _wechatTenpayClient.ExecuteCreatePayTransactionJsapiAsync(request); if (!response.IsSuccessful()) throw Oops.Oh(response.ErrorMessage); var singInfo = this.GenerateParametersForJsapiPay(new WechatPayParaInput() { PrepayId = response.PrepayId }); // ä¿å˜è®¢å•ä¿¡æ¯ var wechatPay = new SysWechatPay() { AppId = _wechatPayOptions.AppId, MerchantId = _wechatPayOptions.MerchantId, OutTradeNumber = request.OutTradeNumber, Description = input.Description, Attachment = input.Attachment, GoodsTag = input.GoodsTag, Total = input.Total, OpenId = input.OpenId, TransactionId = "", Tags = input.Tags, BusinessId = input.BusinessId, }; await _sysWechatPayRep.InsertAsync(wechatPay); return new WechatPayTransactionOutput() { PrepayId = response.PrepayId, OutTradeNumber = request.OutTradeNumber, SingInfo = singInfo }; } /// <summary> /// 微信支付下å•(商户直连)Native /// </summary> [DisplayName("微信支付下å•(商户直连)Native")] public async Task<dynamic> CreatePayTransactionNative([FromBody] WechatPayTransactionInput input) { var request = new CreatePayTransactionNativeRequest() { OutTradeNumber = DateTimeOffset.Now.ToString("yyyyMMddHHmmssfff") + (new Random()).Next(100, 1000), // 订å•å· AppId = _wechatPayOptions.AppId, Description = input.Description, Attachment = input.Attachment, GoodsTag = input.GoodsTag, ExpireTime = DateTimeOffset.Now.AddMinutes(10), NotifyUrl = _payCallBackOptions.WechatPayUrl, Amount = new CreatePayTransactionNativeRequest.Types.Amount() { Total = input.Total }, //Payer = new CreatePayTransactionNativeRequest.Types.Payer() { OpenId = input.OpenId } Scene = new CreatePayTransactionNativeRequest.Types.Scene() { ClientIp = "127.0.0.1" } }; var response = await _wechatTenpayClient.ExecuteCreatePayTransactionNativeAsync(request); if (!response.IsSuccessful()) { JsonConvert.SerializeObject(response).LogInformation(); throw Oops.Oh(response.ErrorMessage); } // ä¿å˜è®¢å•ä¿¡æ¯ var wechatPay = new SysWechatPay() { AppId = _wechatPayOptions.AppId, MerchantId = _wechatPayOptions.MerchantId, OutTradeNumber = request.OutTradeNumber, Description = input.Description, Attachment = input.Attachment, GoodsTag = input.GoodsTag, Total = input.Total, //OpenId = input.OpenId, TransactionId = "", QrcodeContent = response.QrcodeUrl, Tags = input.Tags, BusinessId = input.BusinessId, }; await _sysWechatPayRep.InsertAsync(wechatPay); return new { request.OutTradeNumber, response.QrcodeUrl }; } /// <summary> /// 微信支付下å•(æœåŠ¡å•†æ¨¡å¼) 🔖 /// </summary> [DisplayName("微信支付下å•(æœåŠ¡å•†æ¨¡å¼)")] public async Task<dynamic> CreatePayPartnerTransaction([FromBody] WechatPayTransactionInput input) { var request = new CreatePayPartnerTransactionJsapiRequest() { OutTradeNumber = DateTimeOffset.Now.ToString("yyyyMMddHHmmssfff") + (new Random()).Next(100, 1000), // 订å•å· AppId = _wechatPayOptions.AppId, MerchantId = _wechatPayOptions.MerchantId, SubAppId = _wechatPayOptions.AppId, SubMerchantId = _wechatPayOptions.MerchantId, Description = input.Description, Attachment = input.Attachment, GoodsTag = input.GoodsTag, ExpireTime = DateTimeOffset.Now.AddMinutes(10), NotifyUrl = _payCallBackOptions.WechatPayUrl, Amount = new CreatePayPartnerTransactionJsapiRequest.Types.Amount() { Total = input.Total }, Payer = new CreatePayPartnerTransactionJsapiRequest.Types.Payer() { OpenId = input.OpenId } }; var response = await _wechatTenpayClient.ExecuteCreatePayPartnerTransactionJsapiAsync(request); if (!response.IsSuccessful()) throw Oops.Oh(response.ErrorMessage); var singInfo = this.GenerateParametersForJsapiPay(new WechatPayParaInput() { PrepayId = response.PrepayId }); // ä¿å˜è®¢å•ä¿¡æ¯ var wechatPay = new SysWechatPay() { AppId = _wechatPayOptions.AppId, MerchantId = _wechatPayOptions.MerchantId, SubAppId = _wechatPayOptions.AppId, SubMerchantId = _wechatPayOptions.MerchantId, OutTradeNumber = request.OutTradeNumber, Description = input.Description, Attachment = input.Attachment, GoodsTag = input.GoodsTag, Total = input.Total, OpenId = input.OpenId, TransactionId = "" }; await _sysWechatPayRep.InsertAsync(wechatPay); return new { response.PrepayId, request.OutTradeNumber, singInfo }; } /// <summary> /// èŽ·å–æ”¯ä»˜è®¢å•详情(本地库) 🔖 /// </summary> /// <param name="tradeId"></param> /// <returns></returns> [DisplayName("èŽ·å–æ”¯ä»˜è®¢å•详情(本地库)")] public async Task<SysWechatPay> GetPayInfo(string tradeId) { return await _sysWechatPayRep.GetFirstAsync(u => u.OutTradeNumber == tradeId); } /// <summary> /// èŽ·å–æ”¯ä»˜è®¢å•详情(微信接å£) 🔖 /// </summary> /// <param name="tradeId"></param> /// <returns></returns> [DisplayName("èŽ·å–æ”¯ä»˜è®¢å•详情(微信接å£)")] public async Task<SysWechatPay> GetPayInfoFromWechat(string tradeId) { var request = new GetPayTransactionByOutTradeNumberRequest(); request.OutTradeNumber = tradeId; var response = await _wechatTenpayClient.ExecuteGetPayTransactionByOutTradeNumberAsync(request); // ä¿®æ”¹è®¢å•æ”¯ä»˜çŠ¶æ€ var wechatPay = await _sysWechatPayRep.GetFirstAsync(u => u.OutTradeNumber == response.OutTradeNumber && u.MerchantId == response.MerchantId); // 如果状æ€ä¸ä¸€è‡´å°±æ›´æ–°æ•°æ®åº“ä¸çš„记录 if (wechatPay != null && wechatPay.TradeState != response.TradeState) { wechatPay.OpenId = response.Payer.OpenId; wechatPay.TransactionId = response.TransactionId; // 支付订å•å· wechatPay.TradeType = response.TradeType; // 交易类型 wechatPay.TradeState = response.TradeState; // äº¤æ˜“çŠ¶æ€ wechatPay.TradeStateDescription = response.TradeStateDescription; // äº¤æ˜“çŠ¶æ€æè¿° wechatPay.BankType = response.BankType; // 付款银行类型 wechatPay.Total = response.Amount.Total; // è®¢å•æ€»é‡‘é¢ wechatPay.PayerTotal = response.Amount.PayerTotal; // ç”¨æˆ·æ”¯ä»˜é‡‘é¢ wechatPay.SuccessTime = response.SuccessTime.Value.DateTime; // æ”¯ä»˜å®Œæˆæ—¶é—´ await _sysWechatPayRep.AsUpdateable(wechatPay).IgnoreColumns(true).ExecuteCommandAsync(); } wechatPay = new SysWechatPay() { AppId = _wechatPayOptions.AppId, MerchantId = _wechatPayOptions.MerchantId, SubAppId = _wechatPayOptions.AppId, SubMerchantId = _wechatPayOptions.MerchantId, OutTradeNumber = request.OutTradeNumber, Attachment = response.Attachment, Total = response.Amount.Total, // è®¢å•æ€»é‡‘é¢ TransactionId = response.TransactionId, TradeType = response.TradeType, // 交易类型 TradeState = response.TradeState, // äº¤æ˜“çŠ¶æ€ TradeStateDescription = response.TradeStateDescription, // äº¤æ˜“çŠ¶æ€æè¿° BankType = response.BankType, // 付款银行类型 PayerTotal = response.Amount.PayerTotal, // ç”¨æˆ·æ”¯ä»˜é‡‘é¢ SuccessTime = response.SuccessTime.Value.DateTime // æ”¯ä»˜å®Œæˆæ—¶é—´ }; return wechatPay; } /// <summary> /// 退款申请 /// </summary> /// <param name="input"></param> /// <returns></returns> [DisplayName("退款申请")] [HttpPost] public async Task<dynamic> CreateRefundDomestic([FromBody] WechatPayRefundDomesticInput input) { // refund/domestic/refunds var request = new CreateRefundDomesticRefundRequest() { Amount = new CreateRefundDomesticRefundRequest.Types.Amount() { Refund = input.Refund, Total = input.Total, Currency = "CNY" }, OutTradeNumber = input.TradeId, OutRefundNumber = "R" + DateTimeOffset.Now.ToString("yyyyMMddHHmmssfff") + (new Random()).Next(100, 1000), // 订å•å· NotifyUrl = _payCallBackOptions.WechatPayUrl, Reason = input.Reason, }; var response = await _wechatTenpayClient.ExecuteCreateRefundDomesticRefundAsync(request); if (string.IsNullOrEmpty(response.ErrorCode)) { // æˆåŠŸäº†ï¼Œè¿™é‡Œåº”è¯¥ä¿å˜é€€æ¬¾è®¢å•ä¿¡æ¯ var wechatPay = await _sysWechatPayRep.GetFirstAsync(u => u.OutTradeNumber == response.OutTradeNumber); // ä¿å˜è®¢å•ä¿¡æ¯ if (wechatPay != null) { var wechatRefund = new SysWechatRefund() { WechatPayId = wechatPay.Id, TransactionId = response.TransactionId, Refund = input.Refund, Reason = input.Reason, OutRefundNumber = request.OutRefundNumber, Channel = response.Channel, UserReceivedAccount = response.UserReceivedAccount, }; await _sysWechatRefundRep.InsertAsync(wechatRefund); } } else { throw Oops.Bah($"[{response.ErrorCode}]{response.ErrorMessage}"); } return response; } /// <summary> /// 获å–退款订å•详情(微信接å£) /// </summary> /// <param name="refundId"></param> /// <returns></returns> [DisplayName("获å–退款订å•详情(微信接å£)")] public async Task<SysWechatRefund> GetRefundInfoFromWechat(string refundId) { var request = new GetRefundDomesticRefundByOutRefundNumberRequest(); request.OutRefundNumber = refundId; var response = await _wechatTenpayClient.ExecuteGetRefundDomesticRefundByOutRefundNumberAsync(request); // ä¿®æ”¹è®¢å•æ”¯ä»˜çŠ¶æ€ var wechatRefund = await _sysWechatRefundRep.GetFirstAsync(u => u.OutRefundNumber == refundId); // 如果状æ€ä¸ä¸€è‡´å°±æ›´æ–°æ•°æ®åº“ä¸çš„记录 if (wechatRefund != null && wechatRefund.TradeState != response.Status) { wechatRefund.TransactionId = response.TransactionId; // 支付订å•å· wechatRefund.TradeState = response.Status; // äº¤æ˜“çŠ¶æ€ wechatRefund.SuccessTime = response.SuccessTime.Value.DateTime; // æ”¯ä»˜å®Œæˆæ—¶é—´ await _sysWechatRefundRep.AsUpdateable(wechatRefund).IgnoreColumns(true).ExecuteCommandAsync(); // 有退款,刷新一下订å•çŠ¶æ€ var wechatPay = await _sysWechatPayRep.GetFirstAsync(u => u.Id == wechatRefund.WechatPayId); if (wechatPay != null) await GetPayInfoFromWechat(wechatPay.OutTradeNumber); } wechatRefund = new SysWechatRefund() { TransactionId = response.TransactionId, Refund = response.Amount.Refund, OutRefundNumber = request.OutRefundNumber, Channel = response.Channel, UserReceivedAccount = response.UserReceivedAccount, TradeState = response.Status, // äº¤æ˜“çŠ¶æ€ SuccessTime = response.SuccessTime.Value.DateTime, // æ”¯ä»˜å®Œæˆæ—¶é—´ }; return wechatRefund; } /// <summary> /// 微信支付æˆåŠŸå›žè°ƒ(商户直连) /// </summary> /// <returns></returns> [AllowAnonymous] [DisplayName("微信支付æˆåŠŸå›žè°ƒ(商户直连)")] public async Task<WechatPayOutput> PayCallBack() { using var ms = new MemoryStream(); await App.HttpContext.Request.Body.CopyToAsync(ms); var b = ms.ToArray(); var callbackJson = Encoding.UTF8.GetString(b); var callbackModel = _wechatTenpayClient.DeserializeEvent(callbackJson); if ("TRANSACTION.SUCCESS".Equals(callbackModel.EventType)) { try { var callbackPayResource = _wechatTenpayClient.DecryptEventResource<TransactionResource>(callbackModel); // ä¿®æ”¹è®¢å•æ”¯ä»˜çŠ¶æ€ var wechatPay = await _sysWechatPayRep.GetFirstAsync(u => u.OutTradeNumber == callbackPayResource.OutTradeNumber && u.MerchantId == callbackPayResource.MerchantId); if (wechatPay == null) return null; wechatPay.OpenId = callbackPayResource.Payer.OpenId; // æ”¯ä»˜è€…æ ‡è¯† //wechatPay.MerchantId = callbackResource.MerchantId; // å¾®ä¿¡å•†æˆ·å· //wechatPay.OutTradeNumber = callbackResource.OutTradeNumber; // 商户订å•å· wechatPay.TransactionId = callbackPayResource.TransactionId; // 支付订å•å· wechatPay.TradeType = callbackPayResource.TradeType; // 交易类型 wechatPay.TradeState = callbackPayResource.TradeState; // äº¤æ˜“çŠ¶æ€ wechatPay.TradeStateDescription = callbackPayResource.TradeStateDescription; // äº¤æ˜“çŠ¶æ€æè¿° wechatPay.BankType = callbackPayResource.BankType; // 付款银行类型 wechatPay.Total = callbackPayResource.Amount.Total; // è®¢å•æ€»é‡‘é¢ wechatPay.PayerTotal = callbackPayResource.Amount.PayerTotal; // ç”¨æˆ·æ”¯ä»˜é‡‘é¢ wechatPay.SuccessTime = callbackPayResource.SuccessTime.DateTime; // æ”¯ä»˜å®Œæˆæ—¶é—´ await _sysWechatPayRep.AsUpdateable(wechatPay).IgnoreColumns(true).ExecuteCommandAsync(); return new WechatPayOutput() { Total = wechatPay.Total, Attachment = wechatPay.Attachment, GoodsTag = wechatPay.GoodsTag }; } catch (Exception ex) { "微信支付回调时出错:".LogError(ex); } } else if ("REFUND.SUCCESS".Equals(callbackModel.EventType)) { //å‚考:https://pay.weixin.qq.com/docs/merchant/apis/jsapi-payment/refund-result-notice.html try { var callbackRefundResource = _wechatTenpayClient.DecryptEventResource<RefundResource>(callbackModel); // ä¿®æ”¹è®¢å•æ”¯ä»˜çŠ¶æ€ var wechatRefund = await _sysWechatRefundRep.GetFirstAsync(u => u.OutRefundNumber == callbackRefundResource.OutRefundNumber); if (wechatRefund == null) return null; wechatRefund.TradeState = callbackRefundResource.RefundStatus; // äº¤æ˜“çŠ¶æ€ wechatRefund.SuccessTime = callbackRefundResource.SuccessTime.Value.DateTime; // æ”¯ä»˜å®Œæˆæ—¶é—´ await _sysWechatRefundRep.AsUpdateable(wechatRefund).IgnoreColumns(true).ExecuteCommandAsync(); // 有退款,刷新一下订å•çŠ¶æ€ await GetPayInfoFromWechat(callbackRefundResource.OutTradeNumber); } catch (Exception ex) { "微信退款回调时出错:".LogError(ex); } } else { callbackModel.EventType.LogInformation(); } return null; } /// <summary> /// 微信支付æˆåŠŸå›žè°ƒ(æœåŠ¡å•†æ¨¡å¼) 🔖 /// </summary> /// <returns></returns> [AllowAnonymous] [DisplayName("微信支付æˆåŠŸå›žè°ƒ(æœåŠ¡å•†æ¨¡å¼)")] public async Task PayPartnerCallBack() { using var ms = new MemoryStream(); await App.HttpContext.Request.Body.CopyToAsync(ms); var b = ms.ToArray(); var callbackJson = Encoding.UTF8.GetString(b); var callbackModel = _wechatTenpayClient.DeserializeEvent(callbackJson); if ("TRANSACTION.SUCCESS".Equals(callbackModel.EventType)) { var callbackResource = _wechatTenpayClient.DecryptEventResource<PartnerTransactionResource>(callbackModel); // ä¿®æ”¹è®¢å•æ”¯ä»˜çŠ¶æ€ var wechatPay = await _sysWechatPayRep.GetFirstAsync(u => u.OutTradeNumber == callbackResource.OutTradeNumber && u.MerchantId == callbackResource.MerchantId); if (wechatPay == null) return; //wechatPay.OpenId = callbackResource.Payer.OpenId; // æ”¯ä»˜è€…æ ‡è¯† //wechatPay.MerchantId = callbackResource.MerchantId; // å¾®ä¿¡å•†æˆ·å· //wechatPay.OutTradeNumber = callbackResource.OutTradeNumber; // 商户订å•å· wechatPay.TransactionId = callbackResource.TransactionId; // 支付订å•å· wechatPay.TradeType = callbackResource.TradeType; // 交易类型 wechatPay.TradeState = callbackResource.TradeState; // äº¤æ˜“çŠ¶æ€ wechatPay.TradeStateDescription = callbackResource.TradeStateDescription; // äº¤æ˜“çŠ¶æ€æè¿° wechatPay.BankType = callbackResource.BankType; // 付款银行类型 wechatPay.Total = callbackResource.Amount.Total; // è®¢å•æ€»é‡‘é¢ wechatPay.PayerTotal = callbackResource.Amount.PayerTotal; // ç”¨æˆ·æ”¯ä»˜é‡‘é¢ wechatPay.SuccessTime = callbackResource.SuccessTime.DateTime; // æ”¯ä»˜å®Œæˆæ—¶é—´ await _sysWechatPayRep.AsUpdateable(wechatPay).IgnoreColumns(true).ExecuteCommandAsync(); } } }