/*********************************************************************** * Project: baifenBinfa * ProjectName: 百分兵法管理系统 * Web: http://chuanyin.com * Author: * Email: * CreateTime: 202403/02 * Description: 暂无 ***********************************************************************/ using CoreCms.Net.Configuration; using CoreCms.Net.IRepository; using CoreCms.Net.IServices; using CoreCms.Net.Model.Entities; using CoreCms.Net.Model.ViewModels.UI; using Newtonsoft.Json; using System.Threading.Tasks; using NLog; using System; using System.Globalization; using CoreCms.Net.Utility.Extensions; using CoreCms.Net.Utility.Helper; using Essensoft.Paylink.Alipay; using Essensoft.Paylink.Alipay.Domain; using Essensoft.Paylink.Alipay.Request; using Microsoft.Extensions.DependencyInjection; using Essensoft.Paylink.WeChatPay; using Microsoft.Extensions.Options; using Newtonsoft.Json.Linq; using static Aliyun.OSS.Model.LiveChannelStat; using Essensoft.Paylink.WeChatPay.V2.Request; using Essensoft.Paylink.WeChatPay.V2; namespace CoreCms.Net.Services { /// /// 支付宝支付 接口实现 /// public class AliPayServices : BaseServices, IAliPayServices { private readonly IAlipayClient _client; private readonly IServiceProvider _serviceProvider; private readonly IAlipayConfigServices _alipayConfigServices; public AliPayServices(IWeChatPayRepository dal, IServiceProvider serviceProvider, IAlipayClient client, IAlipayConfigServices alipayConfigServices) { _serviceProvider = serviceProvider; _client = client; _alipayConfigServices = alipayConfigServices; BaseDal = dal; } /// /// 发起支付宝支付 /// /// 实体数据 /// public async Task PubPay(CoreCmsBillPayments entity) { var jm = new WebApiCallBack(); using var container = _serviceProvider.CreateScope(); var billPaymentsServices = container.ServiceProvider.GetService(); //var payment = await billPaymentsServices.QueryByClauseAsync(p => p.paymentId == entity.paymentId); var tradeType = GlobalEnumVars.AliPayPayTradeType.ScanQRCodes.ToString(); if (!string.IsNullOrEmpty(entity.parameters)) { var jObj = (JObject)JsonConvert.DeserializeObject(entity.parameters); if (jObj != null && jObj.TryGetValue("trade_type", out var value)) tradeType = PayHelper.GetAliPayPayTradeType(value.ObjectToString()); } var config = await _alipayConfigServices.QueryByClauseAsync(p => p.isDefault == true && p.isEnable == true && p.appType == tradeType); if (config == null) { jm.msg = "支付配置信息获取失败"; return jm; } if (string.IsNullOrEmpty(config.notifyUrl)) { jm.msg = "未获取到配置的通知地址"; return jm; } var notifyUrl = config.notifyUrl.EndsWith("/") ? config.notifyUrl + "m-" + config.appId : config.notifyUrl + "/m-" + config.appId; //构建linkPay请求配置实体 var payOptions = new AlipayOptions { AppId = config.appId, AlipayPublicKey = config.publicKey, AppPrivateKey = config.privateKey, ServerUrl = config.serverUrl, SignType = config.signType, AppPublicCert = config.appPublicCert, AlipayPublicCert = config.alipayPublicCert, AlipayRootCert = config.alipayRootCert }; //扫码支付 if (tradeType == GlobalEnumVars.AliPayPayTradeType.ScanQRCodes.ToString()) { var model = new AlipayTradePrecreateModel { OutTradeNo = entity.paymentId, Subject = entity.payTitle.Length > 40 ? entity.payTitle[..40] : entity.payTitle, TotalAmount = entity.money.ToString(CultureInfo.InvariantCulture), Body = entity.payTitle.Length > 40 ? entity.payTitle[..40] : entity.payTitle }; var req = new AlipayTradePrecreateRequest(); req.SetBizModel(model); req.SetNotifyUrl(notifyUrl); //req.SetReturnUrl("https://pc.pro.demo.corecms.cn/order/payment/result"); Loging.NLogUtil.WriteAll(LogLevel.Trace, Loging.LogType.Order, "支付宝ScanQRCodes支付拼接APP入参", JsonConvert.SerializeObject(model)); var response = await _client.ExecuteAsync(req, payOptions); Loging.NLogUtil.WriteAll(LogLevel.Trace, Loging.LogType.Order, "支付宝ScanQRCodes支付返回数据", JsonConvert.SerializeObject(response)); jm.data = response.Body; //response.OutTradeNo = entity.paymentId; jm.otherData = response; jm.status = !response.IsError; } //PC网站支付 else if (tradeType == GlobalEnumVars.AliPayPayTradeType.JSAPI_PC.ToString()) { var model = new AlipayTradePagePayModel { OutTradeNo = entity.paymentId, Subject = entity.payTitle.Length > 40 ? entity.payTitle[..40] : entity.payTitle, ProductCode = "FAST_INSTANT_TRADE_PAY", TotalAmount = entity.money.ToString(CultureInfo.InvariantCulture), Body = entity.payTitle.Length > 40 ? entity.payTitle[..40] : entity.payTitle }; var req = new AlipayTradePagePayRequest(); req.SetBizModel(model); req.SetNotifyUrl(notifyUrl); req.SetReturnUrl(config.jumpUrl); Loging.NLogUtil.WriteAll(LogLevel.Trace, Loging.LogType.Order, "支付宝JSAPI_PC支付拼接APP入参", JsonConvert.SerializeObject(model)); var response = await _client.PageExecuteAsync(req, payOptions); Loging.NLogUtil.WriteAll(LogLevel.Trace, Loging.LogType.Order, "支付宝JSAPI_PC支付返回数据", JsonConvert.SerializeObject(response)); jm.data = response.Body; response.TradeNo = entity.paymentId; jm.otherData = response; jm.status = !response.IsError; } //APP支付 else if (tradeType == GlobalEnumVars.AliPayPayTradeType.APP.ToString()) { var model = new AlipayTradeAppPayModel { OutTradeNo = entity.paymentId, Subject = entity.payTitle.Length > 40 ? entity.payTitle[..40] : entity.payTitle, //ProductCode = entity.paymentCode, ProductCode = "QUICK_MSECURITY_PAY", TotalAmount = entity.money.ToString(CultureInfo.InvariantCulture), Body = entity.payTitle.Length > 40 ? entity.payTitle[..40] : entity.payTitle }; var req = new AlipayTradeAppPayRequest(); req.SetBizModel(model); req.SetNotifyUrl(notifyUrl); //req.SetReturnUrl(config.jumpUrl); Loging.NLogUtil.WriteAll(LogLevel.Trace, Loging.LogType.Order, "支付宝APP支付拼接APP入参", JsonConvert.SerializeObject(model)); var response = await _client.SdkExecuteAsync(req, payOptions); Loging.NLogUtil.WriteAll(LogLevel.Trace, Loging.LogType.Order, "支付宝APP支付返回数据", JsonConvert.SerializeObject(response)); jm.data = response.Body; response.TradeNo = entity.paymentId; jm.otherData = response; jm.status = !response.IsError; } //H5支付 else if (tradeType == GlobalEnumVars.AliPayPayTradeType.MWEB.ToString()) { var model = new AlipayTradeWapPayModel { OutTradeNo = entity.paymentId, Subject = entity.payTitle.Length > 40 ? entity.payTitle[..40] : entity.payTitle, //ProductCode = entity.paymentCode, ProductCode = "QUICK_WAP_PAY", TotalAmount = entity.money.ToString(CultureInfo.InvariantCulture), Body = entity.payTitle.Length > 40 ? entity.payTitle[..40] : entity.payTitle }; var req = new AlipayTradeWapPayRequest(); req.SetBizModel(model); req.SetNotifyUrl(notifyUrl); req.SetReturnUrl(config.jumpUrl); Loging.NLogUtil.WriteAll(LogLevel.Trace, Loging.LogType.Order, "支付宝MWEB支付拼接APP入参", JsonConvert.SerializeObject(model)); var response = await _client.PageExecuteAsync(req, payOptions); Loging.NLogUtil.WriteAll(LogLevel.Trace, Loging.LogType.Order, "支付宝MWEB支付返回数据", JsonConvert.SerializeObject(response)); jm.data = response.Body; response.TradeNo = entity.paymentId; jm.otherData = response; jm.status = !response.IsError; } return jm; } /// /// 用户退款 /// /// 退款单数据 /// 支付单数据 /// public async Task Refund(CoreCmsBillRefund refundInfo, CoreCmsBillPayments paymentInfo) { var jm = new WebApiCallBack(); var tradeType = GlobalEnumVars.WeiChatPayTradeType.JSAPI.ToString(); if (!string.IsNullOrEmpty(paymentInfo.parameters)) { var jObj = (JObject)JsonConvert.DeserializeObject(paymentInfo.parameters); if (jObj != null && jObj.TryGetValue("trade_type", out var value)) tradeType = PayHelper.GetWeiChatPayTradeType(value.ObjectToString()); } var config = await _alipayConfigServices.QueryByClauseAsync(p => p.isDefault == true && p.isEnable == true && p.appType == tradeType); if (config == null) { jm.msg = "支付配置信息获取失败"; return jm; } if (string.IsNullOrEmpty(config.refundUrl)) { jm.msg = "未获取到配置的退款通知地址"; return jm; } //构建linkPay请求配置实体 var payOptions = new AlipayOptions { AppId = config.appId, AlipayPublicKey = config.publicKey, AppPrivateKey = config.privateKey, ServerUrl = config.serverUrl, SignType = config.signType, AppPublicCert = config.appPublicCert, AlipayPublicCert = config.alipayPublicCert, AlipayRootCert = config.alipayRootCert }; var model = new AlipayTradeRefundModel { OutTradeNo = paymentInfo.paymentId, TradeNo = paymentInfo.tradeNo, RefundAmount = refundInfo.money.ToString(CultureInfo.InvariantCulture), OutRequestNo = refundInfo.refundId, RefundReason = "用户申请退款", }; var req = new AlipayTradeRefundRequest(); req.SetBizModel(model); var response = await _client.ExecuteAsync(req, payOptions); jm.msg = !response.IsError ? "退款成功" : "退款失败"; jm.status = !response.IsError; jm.data = response; return jm; } } }