using ARW.Admin.WebApi.Controllers; using ARW.Model.Models.Business.Payments; using ARW.Service.Business.IBusinessService.Payments; using Infrastructure.WeChat.TenPay; using Infrastructure; using Microsoft.AspNetCore.Mvc; using Senparc.CO2NET.HttpUtility; using Senparc.Weixin.TenPayV3.Apis; using static Infrastructure.WeChat.TenPay.Pay; using ARW.Admin.WebApi.Framework; using Senparc.Weixin.Open.WxOpenAPIs; using Senparc.Weixin.WxOpen.AdvancedAPIs.WxApp; using ARW.Service.Business.IBusinessService.Custom.Customers; using ARW.Service.Api.IBusinessService.PayManage; using ARW.Service.Api.BusinessService.PaymentManage; using ARW.Model.Dto.Api.Carts; namespace ARW.WebApi.Controllers.Api.Wechat.WxPay { /// /// 微信支付控制器 /// //[Verify] [Route("api/[controller]")] public class WxPayController : BaseController { private readonly ICustomerService _CustomerService; private readonly IPayServiceApi _PayServiceApi; private readonly NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger(); private readonly SenparcHttpClient _httpClient; public WxPayController(ICustomerService customerService, SenparcHttpClient httpClient, IPayServiceApi payServiceApi) { _CustomerService = customerService; _httpClient = httpClient; _PayServiceApi = payServiceApi; } #region 微信支付 /// /// 微信支付(统一下单) /// /// /// [HttpPost("wxPay")] public async Task WxPay([FromBody] CommitPayDtoApi parm) { if (parm == null) { throw new CustomException("请求参数错误"); } var user = JwtUtil.GetLoginUser(App.HttpContext); parm.UserId = user.UserId; /* 统一下单的业务处理 */ var payRes = await _PayServiceApi.HandelPrePay(parm); return SUCCESS(payRes); } /// /// 微信支付回调 /// /// [HttpPost("Notify")] public async Task Notify() { try { logger.Info("进入微信支付回调!"); Pay pay = new Pay(_httpClient); var res = await pay.PayNotifyUrl(); if (res.trade_state == "SUCCESS") { // 业务 var respones = _PayServiceApi.UpdateAsync(f => new Payment { PaymentWeixinNumber = res.transaction_id, PaymentBeforeMoney = res.amount.total, PaymentMoney = res.amount.payer_total, PaymentStatus = 2, Update_time = DateTime.Now, }, f => f.PaymentNumber == res.out_trade_no); } return SUCCESS(""); } catch (Exception e) { throw; } } #endregion #region 订单查询 /// /// 微信支付订单查询 /// /// /// [HttpPost("orderQuery")] public async Task OrderQuery([FromBody] OrderQueryDto parm) { Pay pay = new Pay(_httpClient); var res = await pay.OrderQuery(parm.outTradeNo, parm.transactionId); if (res.VerifySignSuccess == null) throw new CustomException("订单查询失败!"); return SUCCESS(res); } #endregion #region 关闭订单 /// /// 关闭订单接口 /// /// /// [HttpPost("closeOrder")] public async Task CloseOrder([FromBody] OrderQueryDto parm) { Pay pay = new Pay(_httpClient); var res = await pay.CloseOrder(parm.outTradeNo); if (res == null) throw new CustomException("订单关闭失败!"); else { var respones = _PayServiceApi.UpdateAsync(f => new Payment { PaymentStatus = 3, Update_time = DateTime.Now }, f => f.PaymentNumber == parm.outTradeNo); } return SUCCESS(res); } #endregion #region 退款 /// /// 退款接口 /// /// /// [HttpPost("refund")] public async Task Refund([FromBody] OrderQueryDto parm) { Pay pay = new Pay(_httpClient); var payment = _PayServiceApi.GetFirstAsync(s => s.PaymentNumber == parm.outTradeNo).Result; var transactionId = payment.PaymentWeixinNumber; string paymentRefundNumber = ""; if (!string.IsNullOrEmpty(payment.PaymentRefundNumber)) { paymentRefundNumber = payment.PaymentRefundNumber; } var totalFee = payment.PaymentMoney; var res = await pay.Refund(transactionId, totalFee, paymentRefundNumber); if (res.ResultCode.Success == false) throw new CustomException("订单退款失败!"); else { var respones = _PayServiceApi.UpdateAsync(f => new Payment { PaymentRefundNumber = res.out_refund_no, }, f => f.PaymentNumber == res.out_trade_no); } return SUCCESS(res); } /// /// 退款回调 /// /// [HttpPost("refundNotifyUrl")] public async Task RefundNotifyUrl() { try { logger.Info("进入退款回调!", "2134234234"); Pay pay = new Pay(_httpClient); var res = await pay.RefundNotifyUrl(); if (res.refund_status == "SUCCESS") { logger.Info("退款回调之业务:", res.refund_status); // 业务 var respones = _PayServiceApi.UpdateAsync(f => new Payment { PaymentRefundNumber = res.out_refund_no, PaymentStatus = 4, Update_time = DateTime.Now }, f => f.PaymentNumber == res.out_trade_no); } return SUCCESS("66666"); } catch (Exception e) { logger.Error("退款回调错误信息:", e); throw; } } #endregion #region 账单 /// /// 申请交易账单 /// /// [HttpGet("tradeBill")] public async Task TradeBill(string date) { var filePath = $"wwwroot/wxpay/{date}-TradeBill.csv"; Console.WriteLine("FilePath:" + filePath); using (var fs = new FileStream(filePath, FileMode.OpenOrCreate)) { BasePayApis basePayApis = new BasePayApis(); var result = basePayApis.TradeBillQueryAsync(date, fileStream: fs).GetAwaiter().GetResult(); fs.Flush(); } return SUCCESS("已经下载倒指定目录,文件名:" + filePath); } /// /// 申请资金账单接口 /// /// [HttpGet("fundflowBill")] public async Task FundflowBill(string date) { var filePath = $"wwwroot/wxpay/{date}-FundflowBill.csv"; Console.WriteLine("FilePath:" + filePath); using (var fs = new FileStream(filePath, FileMode.OpenOrCreate)) { BasePayApis basePayApis = new BasePayApis(); var result = await basePayApis.FundflowBillQueryAsync(date, fs); fs.Flush(); } return SUCCESS("已经下载倒指定目录,文件名:" + filePath); } #endregion } }