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