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;
namespace ARW.WebApi.Controllers.Api.Wechat.WxPay
{
///
/// 微信支付控制器
///
//[Verify]
[Route("api/[controller]")]
public class WxPayController : BaseController
{
private readonly ICustomerService _CustomerService;
private readonly IPaymentService _PaymentService;
private readonly NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger();
private readonly SenparcHttpClient _httpClient;
public WxPayController(ICustomerService customerService, SenparcHttpClient httpClient, IPaymentService paymentService)
{
_CustomerService = customerService;
_httpClient = httpClient;
_PaymentService = paymentService;
}
#region 微信支付
///
/// 微信支付
///
///
///
[HttpPost("wxPay")]
public async Task WxPay([FromBody] PayDto parm)
{
if (parm == null) { throw new CustomException("请求参数错误"); }
Pay pay = new Pay(_httpClient);
// 获取金额
var price = 1;//单位:分
var user = JwtUtil.GetLoginUser(App.HttpContext);
//var customer = await _CustomerService.GetFirstAsync(s => s.CustomerGuid == user.UserId);
//if (customer != null)
//{
// //parm.openId = customer.CustomerXcxOpenid;
//}
var orderNo = Common.Common.CreateNoQuery();
var payEntity = await pay.PrePay(0, parm.openId, orderNo, parm.payType, price);
if (payEntity == null)
{
throw new CustomException("下单失败!");
}
else
{
var userId = 1600478763014033408;
Payment payment = new Payment
{
//PaymentBusinessGuid = parm.ProductGuid,
PaymentNumber = orderNo,
PaymentBuytype = parm.payType,
CustomerGuid = userId,
PaymentStatus = 1
};
var response = await _PaymentService.InsertReturnSnowflakeIdAsync(payment);
if (response == 0)
throw new CustomException("数据加入失败");
var res = await _PaymentService.GetFirstAsync(s => s.PaymentGuid == response);
PayParams pay1 = new PayParams
{
jsApiUiPackage = payEntity,
outTradeNo = orderNo,
CreateTime = res.Create_time,
OverTime = res.Create_time.AddMinutes(1)
};
return SUCCESS(pay1);
}
}
///
/// 微信支付回调
///
///
[HttpPost("Notify")]
public async Task Notify()
{
try
{
logger.Info("进入微信支付回调!", "2134234234");
Pay pay = new Pay(_httpClient);
var res = await pay.PayNotifyUrl();
if (res.trade_state == "SUCCESS")
{
logger.Info("微信支付回调之业务:", res.trade_state);
// 业务
var respones = _PaymentService.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("66666");
}
catch (Exception e)
{
logger.Error("微信支付回调错误信息:", 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 = _PaymentService.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 = _PaymentService.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 = _PaymentService.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 = _PaymentService.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
}
}