/*********************************************************************** * Project: CoreCms * ProjectName: 核心内容管理系统 * Web: https://www.corecms.net * Author: 大灰灰 * Email: jianweie@163.com * CreateTime: 2021/1/31 21:45:10 * Description: 暂无 ***********************************************************************/ using CoreCms.Net.Configuration; using CoreCms.Net.IServices; using CoreCms.Net.Loging; using CoreCms.Net.Model.Entities; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Options; using Newtonsoft.Json; using NLog; using System; using System.Threading.Tasks; using CoreCms.Net.Caching.AutoMate.RedisCache; using Essensoft.Paylink.WeChatPay; using Essensoft.Paylink.WeChatPay.V2; using Essensoft.Paylink.WeChatPay.V2.Notify; using Microsoft.AspNetCore.Http; using System.IO; using System.Text; namespace CoreCms.Net.Web.WebApi.Controllers.PayNotify { /// /// 微信支付异步通知 /// [Route("Notify/[controller]/[action]")] public class WeChatPayController : ControllerBase { private readonly ICoreCmsBillPaymentsServices _billPaymentsServices; private readonly ICoreCmsBillRefundServices _billRefundServices; private readonly IWeChatPayNotifyClient _client; private readonly IOptions _optionsAccessor; private readonly IRedisOperationRepository _redisOperationRepository; /// /// 构造函数 /// public WeChatPayController( IWeChatPayNotifyClient client , IOptions optionsAccessor , ICoreCmsBillPaymentsServices billPaymentsServices, ICoreCmsBillRefundServices billRefundServices, IRedisOperationRepository redisOperationRepository) { _client = client; _optionsAccessor = optionsAccessor; _billPaymentsServices = billPaymentsServices; _billRefundServices = billRefundServices; _redisOperationRepository = redisOperationRepository; } /// /// 统一下单支付结果通知 /// [HttpPost] public async Task Unifiedorder() { try { // 先读取原始请求 Body //Request.EnableBuffering(); // 允许多次读取流 //string body = ""; //using (var reader = new StreamReader(Request.Body, Encoding.UTF8, leaveOpen: true)) //{ // body = await reader.ReadToEndAsync(); // Request.Body.Position = 0; // 重置流指针,保证后续能再次读取 //} // 打印原始请求内容(方便定位问题) // NLogUtil.WriteAll(LogLevel.Trace, LogType.Order, "微信支付成功回调原始请求", body); var notify = await _client.ExecuteAsync(Request, _optionsAccessor.Value); // 打印解析后的对象 NLogUtil.WriteAll(LogLevel.Trace, LogType.Order, "微信支付成功回调解析结果", JsonConvert.SerializeObject(notify)); if (notify.ReturnCode == WeChatPayCode.Success) { await _redisOperationRepository.ListLeftPushAsync(RedisMessageQueueKey.WeChatPayNotice, JsonConvert.SerializeObject(notify)); return WeChatPayNotifyResult.Success; } NLogUtil.WriteAll(LogLevel.Trace, LogType.Order, "微信支付成功回调", JsonConvert.SerializeObject(notify)); return NoContent(); } catch (Exception ex) { NLogUtil.WriteAll(LogLevel.Trace, LogType.Order, "微信支付成功回调", "统一下单支付结果通知" + $"异常: {ex.Message}", ex); return NoContent(); } } /// /// Retrieves the current WeChat Pay configuration options. /// /// Use this method to obtain the active WeChat Pay settings configured for the /// application. The returned options can be used to verify or display payment configuration details. /// An containing the WeChat Pay options. The result has an HTTP 200 status code and /// includes the options in the response body. [HttpGet] public IActionResult GetWeChatPayOptions() { return Ok(_optionsAccessor.Value); } /// /// 退款结果通知 /// [HttpPost] public async Task Refund() { try { Request.EnableBuffering(); // 允许多次读取流 string body = ""; using (var reader = new StreamReader(Request.Body, Encoding.UTF8, leaveOpen: true)) { body = await reader.ReadToEndAsync(); Request.Body.Position = 0; // 重置流指针,保证后续能再次读取 } //打印原始请求内容(方便定位问题) NLogUtil.WriteAll(LogLevel.Trace, LogType.Refund, "退款收到消息", body); var notify = await _client.ExecuteAsync(Request, _optionsAccessor.Value); NLogUtil.WriteAll(LogLevel.Trace, LogType.Refund, "订单已全额退款", JsonConvert.SerializeObject(notify)); if (notify.ReturnCode == WeChatPayCode.Success) if (notify.RefundStatus == WeChatPayCode.Success) { //Console.WriteLine("OutTradeNo: " + notify.OutTradeNo); var memo = JsonConvert.SerializeObject(notify); await _billRefundServices.UpdateAsync(p => new CoreCmsBillRefund { memo = memo }, p => p.refundId == notify.OutTradeNo); return WeChatPayNotifyResult.Success; } return NoContent(); } catch (Exception ex) { NLogUtil.WriteAll(LogLevel.Trace, LogType.Refund, "微信退款结果通知", "退款结果通知", ex); return NoContent(); } } } }