/*********************************************************************** * Project: baifenBinfa * ProjectName: 百分兵法管理系统 * Web: http://chuanyin.com * Author: * Email: * CreateTime: 202403/02 * 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; 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 IRedisOperationRepository _redisOperationRepository; private readonly IWeChatPayConfigServices _weChatPayConfigServices; /// /// 构造函数 /// public WeChatPayController( IWeChatPayNotifyClient client , ICoreCmsBillPaymentsServices billPaymentsServices, ICoreCmsBillRefundServices billRefundServices, IRedisOperationRepository redisOperationRepository, IWeChatPayConfigServices weChatPayConfigServices) { _client = client; _billPaymentsServices = billPaymentsServices; _billRefundServices = billRefundServices; _redisOperationRepository = redisOperationRepository; _weChatPayConfigServices = weChatPayConfigServices; } /// /// 统一下单支付结果通知 /// [HttpPost] [Route("m-{appid}")] public async Task Unifiedorder([FromRoute(Name = "appid")] string appid) { try { //NLogUtil.WriteAll(LogLevel.Trace, LogType.Order, "微信支付成功接收appid", JsonConvert.SerializeObject(appid)); var config = await _weChatPayConfigServices.QueryByClauseAsync(p => p.isDefault == true && p.isEnable == true && p.appId == appid); //构建linkPay请求配置实体 var payOptions = new WeChatPayOptions { AppId = config.appId, MchId = config.mchId, APIKey = config.apiKey, APIv3Key = config.apiV3Key, Certificate = config.certificate, RsaPublicKey = config.rsaPublicKey, SubAppId = config.subAppId, SubMchId = config.subMchId }; var notify = await _client.ExecuteAsync(Request, payOptions); if (notify.ReturnCode == WeChatPayCode.Success) { await _redisOperationRepository.ListLeftPushAsync(RedisMessageQueueKey.WeChatPayNotice, JsonConvert.SerializeObject(notify)); NLogUtil.WriteAll(LogLevel.Trace, LogType.Order, "微信支付成功回调", JsonConvert.SerializeObject(notify)); return WeChatPayNotifyResult.Success; } else { NLogUtil.WriteAll(LogLevel.Error, LogType.Order, "微信支付成功回调", JsonConvert.SerializeObject(notify)); } return NoContent(); } catch (Exception ex) { NLogUtil.WriteAll(LogLevel.Error, LogType.Order, "微信支付成功回调异常", "统一下单支付结果通知", ex); return NoContent(); } } /// /// 退款结果通知 /// [HttpPost] public async Task Refund() { try { var config = await _weChatPayConfigServices.QueryByClauseAsync(p => p.isDefault == true && p.isEnable == true); //构建linkPay请求配置实体 var payOptions = new WeChatPayOptions { AppId = config.appId, MchId = config.mchId, APIKey = config.apiKey, APIv3Key = config.apiV3Key, Certificate = config.certificate, RsaPublicKey = config.rsaPublicKey, SubAppId = config.subAppId, SubMchId = config.subMchId }; var notify = await _client.ExecuteAsync(Request, payOptions); NLogUtil.WriteAll(LogLevel.Trace, LogType.Refund, "微信退款结果通知", JsonConvert.SerializeObject(notify)); if (notify.ReturnCode != WeChatPayCode.Success) return NoContent(); { var memo = JsonConvert.SerializeObject(notify); var status = notify.RefundStatus == WeChatPayCode.Success ? (int)GlobalEnumVars.BillRefundStatus.STATUS_REFUND : (int)GlobalEnumVars.BillRefundStatus.STATUS_FAIL; await _billRefundServices.UpdateAsync(p => new CoreCmsBillRefund { memo = memo, updateTime = DateTime.Now, status = status }, p => p.refundId == notify.OutTradeNo); //这个返回只是告诉回调这个业务我们接收到了。 return WeChatPayNotifyResult.Success; } } catch (Exception ex) { NLogUtil.WriteAll(LogLevel.Trace, LogType.Refund, "微信退款结果通知", "退款结果通知", ex); return NoContent(); } } } }