From 995b00fc03d611c8a7f96a48bafe4fb66b62ef7b Mon Sep 17 00:00:00 2001 From: lingling <kety1122@163.com> Date: 星期一, 17 三月 2025 10:08:43 +0800 Subject: [PATCH] 添加回调 --- LifePayment/LifePayment.HttpApi/LifePay/WxPayNotifyController.cs | 75 ++++++ LifePayment/LifePayment.Domain/WeChat/WxRechargeInfo.cs | 219 +++++++++++++++++++ LifePayment/LifePayment.HttpApi/LifePay/ACOOLYNotifyController.cs | 124 +++++++++++ LifePayment/LifePayment.Application/User/OssSTSHelper.cs | 62 +++++ LifePayment/LifePayment.HttpApi/LifePay/AccountController.cs | 17 + LifePayment/LifePayment.Host/LifePaymentService.HttpApi.xml | 19 + LifePayment/LifePayment.HttpApi/LifePay/AliPayNotifyController.cs | 130 +++++++++++ 7 files changed, 641 insertions(+), 5 deletions(-) diff --git a/LifePayment/LifePayment.Application/User/OssSTSHelper.cs b/LifePayment/LifePayment.Application/User/OssSTSHelper.cs new file mode 100644 index 0000000..a358c0f --- /dev/null +++ b/LifePayment/LifePayment.Application/User/OssSTSHelper.cs @@ -0,0 +1,62 @@ +锘縰sing Aliyun.Acs.Core; +using Aliyun.Acs.Core.Auth.Sts; +using Aliyun.Acs.Core.Http; +using Aliyun.Acs.Core.Profile; +using LifePayment.Domain.Shared; + +namespace LifePayment.Application +{ + public class OssSTSHelper + { + private const int TokenExpireTime = 3600; + private const string RoleSessionName = "SessionTest"; + private const string PolicyFile = @"{ + ""Version"": ""1"", + ""Statement"": [ + { + ""Effect"": ""Allow"", + ""Action"": ""oss:PutObject"", + ""Resource"": [ + ""acs:oss:*:*:waterdroptest2/*"", + ""acs:oss:*:*:parkmanagement/*"", + ""acs:oss:*:*:jurenlian/*"" + ] + } + ] +}"; + + private readonly OssSettings ossSettings; + + public OssSTSHelper(OssSettings ossSettings) + { + this.ossSettings = ossSettings; + } + + public OssSTSReponse GetOssSTS() + { + string regionId = "cn-hangzhou"; + + IClientProfile profile = DefaultProfile.GetProfile(regionId, ossSettings.OssAccessKeyId, ossSettings.OssAccessSecret); + DefaultAcsClient client = new DefaultAcsClient(profile); + AssumeRoleRequest request = new AssumeRoleRequest(); + + request.Method = MethodType.POST; + + request.RoleArn = ossSettings.OssRoleRan; + request.RoleSessionName = RoleSessionName; + request.Policy = PolicyFile; + request.DurationSeconds = TokenExpireTime; + AssumeRoleResponse response = client.GetAcsResponse(request); + OssSTSReponse result = new OssSTSReponse() + { + Expiration = response.Credentials.Expiration, + OssAccessKeyId = response.Credentials.AccessKeyId, + OssAccessSecret = response.Credentials.AccessKeySecret, + SecurityToken = response.Credentials.SecurityToken, + RequestId = response.RequestId + }; + return result; + } + + } +} diff --git a/LifePayment/LifePayment.Domain/WeChat/WxRechargeInfo.cs b/LifePayment/LifePayment.Domain/WeChat/WxRechargeInfo.cs new file mode 100644 index 0000000..7fc0310 --- /dev/null +++ b/LifePayment/LifePayment.Domain/WeChat/WxRechargeInfo.cs @@ -0,0 +1,219 @@ +锘縰sing LifePayment.Domain.Shared; +using Newtonsoft.Json; +using System.ComponentModel.DataAnnotations; + +namespace LifePayment.Application.Contracts +{ + public class WxRechargeInfo + { + /// <summary> + /// 鍏呭�煎崟鍙� + /// </summary> + public string RechargeNo { get; set; } + + /// <summary> + /// 鍏呭�肩爜鍦板潃 + /// </summary> + public string RechargeCodeUrl { get; set; } + } + + public class WxRechargeInput + { + /// <summary> + /// 鍏呭�奸噾棰濓紝鍗曚綅涓哄厓銆� + /// </summary> + public decimal Amount { get; set; } + + /// <summary> + /// 鍟嗗搧鎻忚堪 + /// </summary> + public string Description { get; set; } = "寰俊鍏呭��"; + + /// <summary> + /// 澶囨敞 + /// </summary> + public string Remark { get; set; } + } + + public class WxRechargeNotifyInput + { + /// <summary> + /// 閫氱煡Id + /// </summary> + [JsonProperty("id")] + [Required] + public string Id { get; set; } + + /// <summary> + /// 閫氱煡鍒涘缓鏃堕棿 + /// </summary> + [JsonProperty("create_time")] + [Required] + public string CreateTime { get; set; } + + /// <summary> + /// 閫氱煡绫诲瀷 + /// </summary> + [JsonProperty("event_type")] + [Required] + public string EventType { get; set; } + + /// <summary> + /// 閫氱煡鏁版嵁绫诲瀷 + /// </summary> + [JsonProperty("resource_type")] + [Required] + public string ResourceType { get; set; } + + /// <summary> + /// 閫氱煡鏁版嵁 + /// </summary> + [JsonProperty("resource")] + [Required] + public Resource Resource { get; set; } + + /// <summary> + /// 鍥炶皟鎽樿 + /// </summary> + [JsonProperty("summary")] + [Required] + public string Summary { get; set; } + } + + public class Resource + { + /// <summary> + /// 鍔犲瘑绠楁硶绫诲瀷 + /// </summary> + [JsonProperty("algorithm")] + [Required] + public string Algorithm { get; set; } + + /// <summary> + /// 鏁版嵁瀵嗘枃 + /// </summary> + [JsonProperty("Ciphertext")] + [Required] + public string Ciphertext { get; set; } + + /// <summary> + /// 闄勫姞鏁版嵁 + /// </summary> + [JsonProperty("associated_data")] + public string AssociatedData { get; set; } + + /// <summary> + /// 鍘熷绫诲瀷 + /// </summary> + [JsonProperty("original_type")] + [Required] + public string OriginalType { get; set; } + + /// <summary> + /// 闅忔満涓� + /// </summary> + [JsonProperty("nonce")] + [Required] + public string Nonce { get; set; } + } + + public class WxPayNotice + { + /// <summary> + /// 搴旂敤Id + /// </summary> + [JsonProperty("appid")] + public string Appid { get; set; } + + /// <summary> + /// 鍟嗘埛鍙� + /// </summary> + [JsonProperty("mchid")] + public string Mchid { get; set; } + + /// <summary> + /// 鍟嗘埛璁㈠崟鍙� + /// </summary> + [JsonProperty("out_trade_no")] + public string OutTradeNo { get; set; } + + /// <summary> + /// 寰俊鏀粯璁㈠崟鍙� + /// </summary> + [JsonProperty("transaction_id")] + public string TransactionId { get; set; } + + /// <summary> + /// 浜ゆ槗绫诲瀷 + /// </summary> + [JsonProperty("trade_type")] + public string TradeType { get; set; } + + /// <summary> + /// 浜ゆ槗鐘舵�� + /// </summary> + [JsonProperty("trade_state")] + public string TradeState { get; set; } + + /// <summary> + /// 浜ゆ槗鐘舵�佹弿杩� + /// </summary> + [JsonProperty("trade_state_desc")] + public string TradeStateDesc { get; set; } + + /// <summary> + /// 浠樻閾惰 + /// </summary> + [JsonProperty("bank_type")] + public string BankType { get; set; } + + /// <summary> + /// 闄勫姞鏁版嵁 + /// </summary> + [JsonProperty("attach")] + public string Attach { get; set; } + + /// <summary> + /// 鏀粯瀹屾垚鏃堕棿 + /// </summary> + [JsonProperty("success_time")] + public string SuccessTime { get; set; } + + /// <summary> + /// 鏀粯鑰� + /// </summary> + [JsonProperty("payer")] + public Payer Payer { get; set; } + + /// <summary> + /// 璁㈠崟閲戦 + /// </summary> + [JsonProperty("amount")] + public Amount Amount { get; set; } + + /// <summary> + /// 鍦烘櫙淇℃伅 + /// </summary> + [JsonProperty("scene_info")] + public SceneInfo SceneInfo { get; set; } + + /// <summary> + /// 浼樻儬鍔熻兘 + /// </summary> + [JsonProperty("promotion_detail")] + public PromotionDetail PromotionDetail { get; set; } + } + + public class WxRechargeNotifyResult + { + /// <summary> + /// 杩斿洖鐘舵�佺爜(閿欒鐮侊紝SUCCESS涓烘帴鏀舵垚鍔燂紝鍏朵粬閿欒鐮佷负澶辫触) + /// </summary> + public string Code { get; set; } + + /// <summary> + /// 杩斿洖淇℃伅锛屽闈炵┖锛屼负閿欒鍘熷洜 + /// </summary> + public string Message { get; set; } + } +} \ No newline at end of file diff --git a/LifePayment/LifePayment.Host/LifePaymentService.HttpApi.xml b/LifePayment/LifePayment.Host/LifePaymentService.HttpApi.xml index 94358b9..f672b0d 100644 --- a/LifePayment/LifePayment.Host/LifePaymentService.HttpApi.xml +++ b/LifePayment/LifePayment.Host/LifePaymentService.HttpApi.xml @@ -19,6 +19,18 @@ <returns></returns> <exception cref="T:Volo.Abp.UserFriendlyException"></exception> </member> + <member name="M:LifePayment.HttpApi.ACOOLYNotifyController.ACOOLYNotify"> + <summary> + ACOOLY鍥炶皟閫氱煡 + </summary> + <returns></returns> + </member> + <member name="M:LifePayment.HttpApi.AliPayNotifyController.AliRechargeNotify"> + <summary> + 鏀粯瀹濆厖鍊煎洖璋冮�氱煡 + </summary> + <returns></returns> + </member> <member name="M:LifePayment.HttpApi.AreaController.GetAreaList"> <summary> 鑾峰彇鐪佸競鍖� @@ -266,5 +278,12 @@ <param name="input"></param> <returns></returns> </member> + <member name="M:LifePayment.HttpApi.WxPayNotifyController.WxRechargeNotify(LifePayment.Application.Contracts.WxRechargeNotifyInput)"> + <summary> + 寰俊鏀粯鍥炶皟閫氱煡 + </summary> + <param name="input"></param> + <returns></returns> + </member> </members> </doc> diff --git a/LifePayment/LifePayment.HttpApi/LifePay/ACOOLYNotifyController.cs b/LifePayment/LifePayment.HttpApi/LifePay/ACOOLYNotifyController.cs new file mode 100644 index 0000000..3c685ec --- /dev/null +++ b/LifePayment/LifePayment.HttpApi/LifePay/ACOOLYNotifyController.cs @@ -0,0 +1,124 @@ +锘縰sing LifePayment.Application.Contracts; +using LifePayment.Domain.Shared; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Logging; +using Newtonsoft.Json; +using System; +using System.IO; +using System.Text; +using System.Threading.Tasks; +using Volo.Abp; +using Volo.Abp.AspNetCore.Mvc; +using Volo.Abp.Uow; + +namespace LifePayment.HttpApi +{ + [Route("api/[controller]/[action]")] + [ApiController] + [IgnoreAntiforgeryToken] + public class ACOOLYNotifyController : AbpController + { + private readonly ILifePayService _lifePayService; + private readonly ILogger<ACOOLYNotifyController> _logger; + + public ACOOLYNotifyController( + ILogger<ACOOLYNotifyController> logger, + ILifePayService lifePayService) + { + _logger = logger; + _lifePayService = lifePayService; + } + + /// <summary> + /// ACOOLY鍥炶皟閫氱煡 + /// </summary> + /// <returns></returns> + [HttpPost] + [UnitOfWork] + [AllowAnonymous] + public async Task ACOOLYNotify() + { + _logger.LogError("ACOOLY鍥炶皟閫氱煡寮�濮嬭繘鍏�"); + var body = string.Empty; + using (var reader = new StreamReader(Request.Body, Encoding.UTF8)) + { + body = await reader.ReadToEndAsync(); + } + if (body.IsNullOrEmpty()) + { + _logger.LogError("ACOOLY鍥炶皟閫氱煡Input涓簄ull"); + throw new UserFriendlyException("ACOOLY鍥炶皟閫氱煡Input涓簄ull"); + } + var baseInfo = JsonConvert.DeserializeObject<ACOOLYRequestBaseResponse>(body); + var orderNo = string.Empty; + var status = LifePayOrderStatusEnum.寰呯‘璁�; + var acoolyOrderNo = string.Empty; + _logger.LogError("ACOOLY鍥炶皟閫氬鐞嗙被鍨嬶細" + baseInfo.Service); + _logger.LogError("ACOOLY鍥炶皟鍐呭锛�" + body); + switch (baseInfo.Service) + { + case ACOOLYConstant.Sevice.ConfirmElectricOrder: + var confirmElectricOrderResponse = JsonConvert.DeserializeObject<ConfirmElectricOrderResponse>(body); + orderNo = confirmElectricOrderResponse.ElectricChargeOrder.OutOrderNo; + acoolyOrderNo = confirmElectricOrderResponse.ElectricChargeOrder.BusiOrderNo; + _logger.LogError("ACOOLY鍥炶皟閫氬鐞嗙粨鏋滅姸鎬侊細" + confirmElectricOrderResponse.ElectricChargeOrder.Status); + if (!confirmElectricOrderResponse.Success + || (confirmElectricOrderResponse.Code != ACOOLYConstant.Code.SUCCESS && confirmElectricOrderResponse.Code != ACOOLYConstant.Code.PROCESSING)) + { + status = LifePayOrderStatusEnum.宸插け璐�; + } + else + + if (confirmElectricOrderResponse.ElectricChargeOrder.Status == ACOOLYConstant.Code.SUCCESS) + { + status = LifePayOrderStatusEnum.宸插畬鎴�; + } + else + + if (confirmElectricOrderResponse.ElectricChargeOrder.Status == ACOOLYConstant.Code.PROCESSING) + { + status = LifePayOrderStatusEnum.寰呯‘璁�; + } + else + { + status = LifePayOrderStatusEnum.宸插け璐�; + } + + break; + case ACOOLYConstant.Sevice.ConfirmPhoneOrder: + var confirmPhoneOrderResponse = JsonConvert.DeserializeObject<ConfirmPhoneOrderResponse>(body); + orderNo = confirmPhoneOrderResponse.PhoneChargeOrder.OutOrderNo; + acoolyOrderNo = confirmPhoneOrderResponse.PhoneChargeOrder.BusiOrderNo; + _logger.LogError("ACOOLY鍥炶皟閫氬鐞嗙粨鏋滅姸鎬侊細" + confirmPhoneOrderResponse.PhoneChargeOrder.Status); + if (!confirmPhoneOrderResponse.Success + || (confirmPhoneOrderResponse.Code != ACOOLYConstant.Code.SUCCESS && confirmPhoneOrderResponse.Code != ACOOLYConstant.Code.PROCESSING)) + { + status = LifePayOrderStatusEnum.宸插け璐�; + } + else + + if (confirmPhoneOrderResponse.PhoneChargeOrder.Status == ACOOLYConstant.Code.SUCCESS) + { + status = LifePayOrderStatusEnum.宸插畬鎴�; + } + else + + if (confirmPhoneOrderResponse.PhoneChargeOrder.Status == ACOOLYConstant.Code.PROCESSING) + { + status = LifePayOrderStatusEnum.寰呯‘璁�; + } + else + { + status = LifePayOrderStatusEnum.宸插け璐�; + } + break; + + default: + break; + } + + await _lifePayService.ACOOLYOrderNotifyHandler(orderNo, acoolyOrderNo, status); + } + } +} \ No newline at end of file diff --git a/LifePayment/LifePayment.HttpApi/LifePay/AccountController.cs b/LifePayment/LifePayment.HttpApi/LifePay/AccountController.cs index c786435..3f95827 100644 --- a/LifePayment/LifePayment.HttpApi/LifePay/AccountController.cs +++ b/LifePayment/LifePayment.HttpApi/LifePay/AccountController.cs @@ -1,4 +1,6 @@ -锘縰sing LifePayment.Application.Contracts; +锘縰sing LifePayment.Application; +using LifePayment.Application.Contracts; +using LifePayment.Domain.Shared; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Options; @@ -15,19 +17,19 @@ public class AccountController : AbpController { private readonly IAccountService _accountService; - + private readonly OssSettings ossSettings; private readonly IWebClientInfoProvider _webClientInfoProvider; public AccountController( IAccountService accountService, - + IOptionsMonitor<OssSettings> optionsMonitor, IWebClientInfoProvider webClientInfoProvider ) { _accountService = accountService; - + this.ossSettings = optionsMonitor.CurrentValue; _webClientInfoProvider = webClientInfoProvider; } @@ -60,7 +62,12 @@ return await _accountService.LifePayPhoneMesssageCodeLogin(input); } - + [HttpPost] + public OssSTSReponse GetOssSTS() + { + OssSTSHelper ossSTSHelper = new OssSTSHelper(this.ossSettings); + return ossSTSHelper.GetOssSTS(); + } #endregion diff --git a/LifePayment/LifePayment.HttpApi/LifePay/AliPayNotifyController.cs b/LifePayment/LifePayment.HttpApi/LifePay/AliPayNotifyController.cs new file mode 100644 index 0000000..e057499 --- /dev/null +++ b/LifePayment/LifePayment.HttpApi/LifePay/AliPayNotifyController.cs @@ -0,0 +1,130 @@ +锘縰sing LifePayment.Application.Contracts; +using LifePayment.Domain.Shared; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Logging; +using Newtonsoft.Json; +using System; +using System.Linq; +using System.Text.RegularExpressions; +using System.Threading.Tasks; +using Volo.Abp.AspNetCore.Mvc; +using Volo.Abp.Uow; + +namespace LifePayment.HttpApi +{ + [Route("api/[controller]/[action]")] + [ApiController] + [IgnoreAntiforgeryToken] + //[Authorize(AuthenticationSchemes = AliPaySignAuthenticationDefaults.AuthenticationScheme)] + public class AliPayNotifyController : AbpController + { + + private readonly ILifePayService _lifePayService; + + private readonly ILogger<AliPayNotifyController> _logger; + + public AliPayNotifyController( + + ILogger<AliPayNotifyController> logger, + + ILifePayService lifePayService) + { + _logger = logger; + _lifePayService = lifePayService; + } + + /// <summary> + /// 鏀粯瀹濆厖鍊煎洖璋冮�氱煡 + /// </summary> + /// <returns></returns> + [HttpPost] + [UnitOfWork] + public async Task<ContentResult> AliRechargeNotify() + { + _logger.LogError($"鐢熸椿绠″鏀粯瀹濆厖鍊煎洖璋冮�氱煡锛氳繘鍏ユ敮浠樺疂鍥炶皟"); + var request = await this.HttpContext.Request.ReadFormAsync(); + var requestToDic = request.ToDictionary(r => r.Key, r => r.Value.ToString()); + var serializeRequest = JsonConvert.SerializeObject(requestToDic); + _logger.LogError($"鐢熸椿绠″鏀粯瀹濆厖鍊煎洖璋冮�氱煡锛歿serializeRequest}"); + + //var serializeRequest = "{\"gmt_create\":\"2025-02-25 13:18:59\",\"charset\":\"UTF-8\",\"seller_email\":\"zfb1@818nb.com\",\"subject\":\"鐢熸椿缂磋垂-璇濊垂\",\"sign\":\"Sp06G1GxrAfDvoHPz9l3DJ20SxhvRzEGFeCGu4LHrSWmEG4OY7MHMx+iJi54ETbdXV0YsyDH9JZD7PWN3HCpEq/wGO4Wh4VSYSe7lqxD6r4f/HFiB0YlrdQoSzjZgYPzLjy6bcdlKRRHOeDkgs2i7TfvIsxWxHs9t0xuS0RlkpdZfb7d7m0EuZ/3v2Cbsj5AHjxb1S2PkO0oQyriYgGQdmkPqILZHwieST+tNEHS4dGFKYu2nkfctAGjWIDv/hKQNY7jEUxsEeG0SnK4TPU8zNplFR9/aKM0Wfwp1pdlaiP2u/d8vOtNh5q+emvaYbKrUkIEFBok8pDLNDta7ZjtVw==\",\"invoice_amount\":\"0.01\",\"buyer_open_id\":\"071xYXDfXBLAI9U11jg_WrH1K6hWq8HYGz0u85xBivf3Sce\",\"notify_id\":\"2025022501222131904087711494539601\",\"fund_bill_list\":\"[{\\\"amount\\\":\\\"0.01\\\",\\\"fundChannel\\\":\\\"ALIPAYACCOUNT\\\"}]\",\"notify_type\":\"trade_status_sync\",\"trade_status\":\"TRADE_SUCCESS\",\"receipt_amount\":\"0.01\",\"buyer_pay_amount\":\"0.01\",\"app_id\":\"2021004171602214\",\"sign_type\":\"RSA2\",\"seller_id\":\"2088050542042301\",\"gmt_payment\":\"2025-02-25 13:19:03\",\"notify_time\":\"2025-02-25 13:44:34\",\"merchant_app_id\":\"2021004171602214\",\"version\":\"1.0\",\"out_trade_no\":\"JF202502251318555214671\",\"total_amount\":\"0.01\",\"trade_no\":\"2025022522001487711401331043\",\"auth_app_id\":\"2021004171602214\",\"buyer_logon_id\":\"130****2238\",\"point_amount\":\"0.00\"}"; + var input = JsonConvert.DeserializeObject<AliRechargeNotifyInput>(serializeRequest); + + if (input.OutTradeNo.StartsWith("JF") && Regex.IsMatch(input.OutTradeNo, @"^JF\d+$")) + { + if (input.TradeStatus == LifePaymentConstant.AliPayStatus.鏀粯鎴愬姛) + { + await _lifePayService.LifePaySuccessHandler(input.OutTradeNo, input.TradeNo); + } + } + + return new ContentResult + { + Content = "success", + }; + } + +#if DEBUG + + [HttpGet] + [UnitOfWork] + [AllowAnonymous] + public async Task<ContentResult> TestAliRechargeNotify(string outTradeNo, string tradeNo, bool success) + { + if (outTradeNo.StartsWith("JF") && Regex.IsMatch(outTradeNo, @"^JF\d+$")) + { + if (success) + { + await _lifePayService.LifePaySuccessHandler(outTradeNo, tradeNo); + } + } + + return new ContentResult + { + Content = "success", + }; + } + +#endif + + /// <summary> + /// 鍗曠瑪杞处鍒版敮浠樺疂璐︽埛銆佸崟绗旇浆璐﹀埌閾惰鍗°�丆2C鐜伴噾绾㈠寘銆丅2C鐜伴噾绾㈠寘鍗曟嵁鐘舵�佸彉鏇村悗瑙﹀彂鐨勯�氱煡 + /// </summary> + /// <returns></returns> + //[HttpPost] + //[UnitOfWork] + //public async Task<ContentResult> NotifyOrderChanged() + //{ + // var request = await this.HttpContext.Request.ReadFormAsync(); + // var requestToDic = request.ToDictionary(r => r.Key, r => r.Value.ToString()); + // var serializeRequest = JsonConvert.SerializeObject(requestToDic); + // _logger.LogError($"鍗曠瑪杞处鍥炶皟锛歿serializeRequest}"); + // if (requestToDic["msg_method"] == "alipay.fund.trans.order.changed") + // { + // var input = JsonConvert.DeserializeObject<FundOrderChangedInput>(serializeRequest); + // if (input.BizContent != null) + // { + // if (input.BizContent.OutBizNo.Contains(RequestCode.AlipayCharge)) + // { + // await _walletService.FundTransOrderChangedForRecharge(input.BizContent); + // } + // else + // { + // await _walletService.FundTransOrderChangedForSingleTransfer(input.BizContent); + + // } + // } + // } + + + // return new ContentResult + // { + // Content = "success", + // }; + //} + + + + } +} \ No newline at end of file diff --git a/LifePayment/LifePayment.HttpApi/LifePay/WxPayNotifyController.cs b/LifePayment/LifePayment.HttpApi/LifePay/WxPayNotifyController.cs new file mode 100644 index 0000000..54d3114 --- /dev/null +++ b/LifePayment/LifePayment.HttpApi/LifePay/WxPayNotifyController.cs @@ -0,0 +1,75 @@ +锘縰sing LifePayment.Application.Contracts; +using LifePayment.Domain; +using LifePayment.Domain.Shared; +using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Logging; +using Newtonsoft.Json; +using System; +using System.Text.RegularExpressions; +using System.Threading.Tasks; +using Volo.Abp.AspNetCore.Mvc; +using Volo.Abp.Uow; + +namespace LifePayment.HttpApi +{ + [Route("api/[controller]/[action]")] + [ApiController] + [IgnoreAntiforgeryToken] + // [Authorize(AuthenticationSchemes = WxPaySignAuthenticationDefaults.AuthenticationScheme)] + public class WxPayNotifyController : AbpController + { + + private readonly IWxPayApi _wxPayApi; + private readonly ILifePayService _lifePayService; + private readonly ILogger<WxPayNotifyController> _logger; + + public WxPayNotifyController( + IWxPayApi wxPayApi, + ILogger<WxPayNotifyController> logger, + ILifePayService lifePayService) + { + _wxPayApi = wxPayApi; + _logger = logger; + _lifePayService = lifePayService; + } + + /// <summary> + /// 寰俊鏀粯鍥炶皟閫氱煡 + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + [HttpPost] + [UnitOfWork] + public async Task<WxRechargeNotifyResult> WxRechargeNotify(WxRechargeNotifyInput input) + { + try + { + _logger.LogError($"鐢熸椿绠″寰俊鍏呭�煎洖璋冮�氱煡锛氳繘鍏ュ井淇″洖璋�"); + var data = _wxPayApi.AesGcmDecrypt(input.Resource.AssociatedData, input.Resource.Nonce, input.Resource.Ciphertext); + var wxPayNotice = JsonConvert.DeserializeObject<WxPayNotice>(data); + + if (wxPayNotice.OutTradeNo.StartsWith("JF") && Regex.IsMatch(wxPayNotice.OutTradeNo, @"^JF\d+$")) + { + if (wxPayNotice.TradeState == LifePaymentConstant.WxPayStatus.鏀粯鎴愬姛) + { + await _lifePayService.LifePaySuccessHandler(wxPayNotice.OutTradeNo, wxPayNotice.TransactionId); + } + } + } + catch (Exception ex) + { + await CurrentUnitOfWork.RollbackAsync(); + return new WxRechargeNotifyResult + { + Code = "FAIL", + Message = ex.Message, + }; + } + + return new WxRechargeNotifyResult + { + Code = "SUCCESS", + }; + } + } +} \ No newline at end of file -- Gitblit v1.9.1