/*********************************************************************** * Project: baifenBinfa * ProjectName: 百分兵法管理系统 * Web: http://chuanyin.com * Author: * Email: * CreateTime: 202403/02 * Description: 暂无 ***********************************************************************/ using System; using System.Threading.Tasks; using System.Xml; using CoreCms.Net.Caching.AutoMate.RedisCache; using CoreCms.Net.Configuration; using CoreCms.Net.IServices; using CoreCms.Net.Loging; using Essensoft.Paylink.Alipay; using Essensoft.Paylink.Alipay.Notify; using Essensoft.Paylink.Alipay.Utility; using Google.Protobuf.WellKnownTypes; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Options; using Newtonsoft.Json; using NLog; namespace CoreCms.Net.Web.WebApi.Controllers.PayNotify { /// /// 支付宝异步通知 /// [Route("Notify/[controller]/[action]")] public class AliPayController : ControllerBase { private readonly IAlipayNotifyClient _client; private readonly IRedisOperationRepository _redisOperationRepository; private readonly IAlipayConfigServices _alipayConfigServices; /// /// 构造函数 /// /// /// /// public AliPayController(IAlipayNotifyClient client, IRedisOperationRepository redisOperationRepository, IAlipayConfigServices alipayConfigServices) { _client = client; _redisOperationRepository = redisOperationRepository; _alipayConfigServices = alipayConfigServices; } #region 支付宝统一回调接口 /// /// APP支付统一下单支付结果通知 /// https://api.pro.coreshop.cn/Notify/AliPay/Unifiedorder /// [HttpPost] [Route("m-{appid}")] public async Task Unifiedorder([FromRoute(Name = "appid")] string appid) { try { var config = await _alipayConfigServices.QueryByClauseAsync(p => p.isDefault == true && p.isEnable == true && p.appId == 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 }; var notify = await _client.ExecuteAsync(Request, payOptions); if (notify.TradeStatus == AlipayTradeStatus.Success) { await _redisOperationRepository.ListLeftPushAsync(RedisMessageQueueKey.AliPayNotice, JsonConvert.SerializeObject(notify)); NLogUtil.WriteAll(LogLevel.Trace, LogType.Order, "支付宝支付成功回调", JsonConvert.SerializeObject(notify)); return AlipayNotifyResult.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(); } } #endregion #region 其他 /// /// 应用网关 /// /// [HttpPost] [Route("m-{appid}")] public async Task Gateway([FromRoute(Name = "appid")] string appid) { try { var config = await _alipayConfigServices.QueryByClauseAsync(p => p.isDefault == true && p.isEnable == true && p.appId == 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 }; var service = Request.Form["service"].ToString(); switch (service) { // 激活开发者模式 case "alipay.service.check": { var options = payOptions; // 获取参数 var parameters = await _client.GetParametersAsync(Request); var sign = parameters["sign"]; parameters.Remove("sign"); var signContent = AlipaySignature.GetSignContent(parameters); // 验签 //var isSuccess = AlipaySignature.RSACheckContent(signContent, sign, options.AlipayPublicKey, options.SignType); // 验签 var isSuccess = AlipaySignature.RSACheckContent(signContent, sign, options.AlipayPublicKey, options.SignType); // 组XML响应内容 //var response = MakeVerifyGWResponse(isSuccess, options.AlipayPublicKey, options.AppPrivateKey, options.SignType); var response = MakeVerifyGwResponse(isSuccess, options.AlipayPublicKey, options.AppPrivateKey, options.SignType); return Content(response, "text/xml"); } } var msg_method = Request.Form["msg_method"].ToString(); switch (msg_method) { // 资金单据状态变更通知 case "alipay.fund.trans.order.changed": { var notify = await _client.CertificateExecuteAsync(Request, payOptions); return AlipayNotifyResult.Success; } // 第三方应用授权取消消息 case "alipay.open.auth.appauth.cancelled": { var notify = await _client.CertificateExecuteAsync(Request, payOptions); return AlipayNotifyResult.Success; } // 用户授权取消消息 case "alipay.open.auth.userauth.cancelled": { var notify = await _client.CertificateExecuteAsync(Request, payOptions); return AlipayNotifyResult.Success; } // 小程序审核通过通知 case "alipay.open.mini.version.audit.passed": { var notify = await _client.CertificateExecuteAsync(Request, payOptions); return AlipayNotifyResult.Success; } // 用户授权取消消息 case "alipay.open.mini.version.audit.rejected": { var notify = await _client.CertificateExecuteAsync(Request, payOptions); return AlipayNotifyResult.Success; } // 收单资金结算到银行账户,结算退票的异步通知 case "alipay.trade.settle.dishonoured": { var notify = await _client.CertificateExecuteAsync(Request, payOptions); return AlipayNotifyResult.Success; } // 收单资金结算到银行账户,结算失败的异步通知 case "alipay.trade.settle.fail": { var notify = await _client.CertificateExecuteAsync(Request, payOptions); return AlipayNotifyResult.Success; } // 收单资金结算到银行账户,结算成功的异步通知 case "alipay.trade.settle.success": { var notify = await _client.CertificateExecuteAsync(Request, payOptions); return AlipayNotifyResult.Success; } } return NoContent(); } catch { return NoContent(); } } /// /// 扫码支付异步通知 /// [HttpPost] [Route("m-{appid}")] public async Task Precreate([FromRoute(Name = "appid")] string appid) { try { var config = await _alipayConfigServices.QueryByClauseAsync(p => p.isDefault == true && p.isEnable == true && p.appId == 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 }; var notify = await _client.ExecuteAsync(Request, payOptions); if (notify.TradeStatus == AlipayTradeStatus.Success) { await _redisOperationRepository.ListLeftPushAsync(RedisMessageQueueKey.AliPayNotice, JsonConvert.SerializeObject(notify)); return AlipayNotifyResult.Success; } NLogUtil.WriteAll(LogLevel.Trace, LogType.Order, "支付宝支付成功回调", JsonConvert.SerializeObject(notify)); return NoContent(); } catch (Exception ex) { NLogUtil.WriteAll(LogLevel.Trace, LogType.Order, "支付宝支付成功回调", "统一下单支付结果通知", ex); return NoContent(); } } /// /// APP支付异步通知 /// [HttpPost] [Route("m-{appid}")] public async Task AppPay([FromRoute(Name = "appid")] string appid) { try { var config = await _alipayConfigServices.QueryByClauseAsync(p => p.isDefault == true && p.isEnable == true && p.appId == 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 }; var notify = await _client.CertificateExecuteAsync(Request, payOptions); if (notify.TradeStatus == AlipayTradeStatus.Success) { Console.WriteLine("OutTradeNo: " + notify.OutTradeNo); return AlipayNotifyResult.Success; } return NoContent(); } catch { return NoContent(); } } /// /// 电脑网站支付异步通知 /// [HttpPost] [Route("m-{appid}")] public async Task PagePay([FromRoute(Name = "appid")] string appid) { try { var config = await _alipayConfigServices.QueryByClauseAsync(p => p.isDefault == true && p.isEnable == true && p.appId == 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 }; var notify = await _client.CertificateExecuteAsync(Request, payOptions); if (notify.TradeStatus == AlipayTradeStatus.Success) { Console.WriteLine("OutTradeNo: " + notify.OutTradeNo); return AlipayNotifyResult.Success; } return NoContent(); } catch { return NoContent(); } } /// /// 手机网站支付异步通知 /// [HttpPost] [Route("m-{appid}")] public async Task WapPay([FromRoute(Name = "appid")] string appid) { try { var config = await _alipayConfigServices.QueryByClauseAsync(p => p.isDefault == true && p.isEnable == true && p.appId == 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 }; var notify = await _client.CertificateExecuteAsync(Request, payOptions); if (notify.TradeStatus == AlipayTradeStatus.Success) { Console.WriteLine("OutTradeNo: " + notify.OutTradeNo); return AlipayNotifyResult.Success; } return NoContent(); } catch { return NoContent(); } } private static string MakeVerifyGwResponse(bool isSuccess, string certPublicKey, string appPrivateKey, string signType) { var xmlDoc = new XmlDocument(); //创建实例 var xmldecl = xmlDoc.CreateXmlDeclaration("1.0", "GBK", null); xmlDoc.AppendChild(xmldecl); var xmlElem = xmlDoc.CreateElement("alipay"); //新建元素 xmlDoc.AppendChild(xmlElem); //添加元素 var alipay = xmlDoc.SelectSingleNode("alipay"); var response = xmlDoc.CreateElement("response"); var success = xmlDoc.CreateElement("success"); if (isSuccess) { success.InnerText = "true";//设置文本节点 response.AppendChild(success);//添加到节点中 } else { success.InnerText = "false";//设置文本节点 response.AppendChild(success);//添加到节点中 var err = xmlDoc.CreateElement("error_code"); err.InnerText = "VERIFY_FAILED"; response.AppendChild(err); } var bizContent = xmlDoc.CreateElement("biz_content"); bizContent.InnerText = certPublicKey; response.AppendChild(bizContent); alipay.AppendChild(response); var sign = xmlDoc.CreateElement("sign"); //sign.InnerText = AlipaySignature.RSASignContent(response.InnerXml, appPrivateKey, signType); sign.InnerText = AlipaySignature.RSASignContent(response.InnerXml, appPrivateKey, signType); alipay.AppendChild(sign); var sign_type = xmlDoc.CreateElement("sign_type"); sign_type.InnerText = signType; alipay.AppendChild(sign_type); return xmlDoc.InnerXml; } #endregion } }