diff --git a/New_College.Api/Controllers/Back/D_PlanMajorDescController.cs b/New_College.Api/Controllers/Back/D_PlanMajorDescController.cs index e6b294e..38e5b77 100644 --- a/New_College.Api/Controllers/Back/D_PlanMajorDescController.cs +++ b/New_College.Api/Controllers/Back/D_PlanMajorDescController.cs @@ -41,6 +41,38 @@ namespace New_College.Api.Controllers + /// + /// 智能填报预览图 + /// + /// + /// + [HttpGet] + public async Task> GetAIPerview([FromQuery] OneSubmitGoRequest request) + { + var test = (await _VolunteerTableServices.Query()).FirstOrDefault(); + var pie = new List(); + pie.Add(new PieChatsDto() { name = "需冲刺", value = 560 }); + pie.Add(new PieChatsDto() { name = "较稳妥", value = 1301 }); + pie.Add(new PieChatsDto() { name = "可保底", value = 600 }); + var ulist = new List(); + ulist.Add(new UniversityPerviewDto() { Name = "985", Count = 7 }); + ulist.Add(new UniversityPerviewDto() { Name = "211", Count = 18 }); + ulist.Add(new UniversityPerviewDto() { Name = "双一流", Count = 56 }); + ulist.Add(new UniversityPerviewDto() { Name = "省重点", Count = 42 }); + ulist.Add(new UniversityPerviewDto() { Name = "公办", Count = 134 }); + ulist.Add(new UniversityPerviewDto() { Name = "民办", Count = 10 }); + return new MessageModel() + { + msg = "ok", + response = new AIPerviewDto() + { + pieChats = pie, + universities = ulist + }, + success = true + }; + } + /// /// 查询扩缩招院校招生计划详情 /// @@ -272,7 +304,7 @@ namespace New_College.Api.Controllers UniversityId = c.UniversityId, UniversityName = c.UniversityName, VolunteerTableId = id, - VolunteerRemark =JsonConvert.SerializeObject(c.VolunteerRemark) + VolunteerRemark = JsonConvert.SerializeObject(c.VolunteerRemark) }).ToList(); itemIds = await _VolunteerTableDetailServices.Add(itemlist); } diff --git a/New_College.Api/Controllers/Front/PayQrCodeController.cs b/New_College.Api/Controllers/Front/PayQrCodeController.cs index 6e248a8..c25ca49 100644 --- a/New_College.Api/Controllers/Front/PayQrCodeController.cs +++ b/New_College.Api/Controllers/Front/PayQrCodeController.cs @@ -29,7 +29,7 @@ namespace New_College.Api.Controllers { var filestream = await v_OrderInfoServices.QrCodePay(query); - + Response.Headers.Add("Content-Type", "image/png"); return File(filestream, "image/png"); } } diff --git a/New_College.Api/Controllers/Front/WeixinPayController.cs b/New_College.Api/Controllers/Front/WeixinPayController.cs index d6e60a1..a3dee72 100644 --- a/New_College.Api/Controllers/Front/WeixinPayController.cs +++ b/New_College.Api/Controllers/Front/WeixinPayController.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.IO; using System.Linq; using System.Net.Http; +using System.Security.Cryptography; using System.Text; using System.Threading.Tasks; using Microsoft.AspNetCore.Authorization; @@ -158,7 +159,7 @@ namespace New_College.Api.Controllers.Front /// [HttpPost] [AllowAnonymous] - public async Task PayNotify() + public async Task OldPayNotify() { logger.LogInformation("开始回调PayNotify"); DingHookHelper.DingTalkHookMessage("开始回调PayNotify", "开始回调PayNotify"); @@ -172,6 +173,7 @@ namespace New_College.Api.Controllers.Front var builder = reader.ReadToEnd(); //WebHookHelper.WebHookmarkdownSend(builder.ToString()); + DingHookHelper.DingTalkHookMessage("xml", builder.ToString()); try { data.FromXml(builder.ToString()); @@ -190,15 +192,15 @@ namespace New_College.Api.Controllers.Front }; // WebHookHelper.WebHookmarkdownSend("Check sign success"); //检查支付结果中transaction_id是否存在 - if (!data.IsSet("transaction_id")) - { - DingHookHelper.DingTalkHookMessage("回调PayNotify", "支付结果中微信订单号不存在"); - //若transaction_id不存在,则立即返回结果给微信支付后台 - res.SetValue("return_code", "FAIL"); - res.SetValue("return_msg", "支付结果中微信订单号不存在"); - //WebHookHelper.WebHookmarkdownSend("支付结果中微信订单号不存在"); - return Content(res.ToXml(), "text/xml"); - } + //if (!data.IsSet("transaction_id")) + //{ + // DingHookHelper.DingTalkHookMessage("回调PayNotify", "支付结果中微信订单号不存在"); + // //若transaction_id不存在,则立即返回结果给微信支付后台 + // res.SetValue("return_code", "FAIL"); + // res.SetValue("return_msg", "支付结果中微信订单号不存在"); + // //WebHookHelper.WebHookmarkdownSend("支付结果中微信订单号不存在"); + // return Content(res.ToXml(), "text/xml"); + //} // 执行订单状态操作 string out_trade_no = data.GetValue("out_trade_no").ToString(); logger.LogInformation("开始回调PayNotify" + out_trade_no); @@ -246,7 +248,188 @@ namespace New_College.Api.Controllers.Front return Content(res.ToXml(), "text/xml"); } + [HttpPost] + [AllowAnonymous] + public async Task PayNotify() + { + var buffer = new MemoryStream(); + Request.Body.CopyTo(buffer); + var str = Encoding.UTF8.GetString(buffer.GetBuffer()); + DingHookHelper.DingTalkHookMessage("PayNotify-buffer", str); + var wxPayNotifyModel = JsonConvert.DeserializeObject(str); + var resource = wxPayNotifyModel?.resource ?? new WxPayResourceModel(); + var decryptStr = AesGcmHelper.AesGcmDecrypt(resource.associated_data, resource.nonce, resource.ciphertext, WeixinConfig.APIv3Key); + var decryptModel = JsonConvert.DeserializeObject(decryptStr); + + var viewModel = new WxPayCallbackViewModel(); + if (decryptModel != null&&decryptModel.trade_state== "SUCCESS") + { + DingHookHelper.DingTalkHookMessage("PayNotify-decryptModel", decryptModel.ToJson()); + var info = await v_OrderInfoRepository.Query(x => x.out_trade_no == decryptModel.out_trade_no); + if (info.Count <= 0) + { + viewModel.message = "在自有平台未找到该订单号"; + viewModel.code = "FAIL"; + DingHookHelper.DingTalkHookMessage("回调PayNotify", "在自有平台未找到该订单号" + decryptModel.out_trade_no); + return viewModel; + } + var oneinfo = info.FirstOrDefault(); + oneinfo.Status = EnumOrderType.payoff; + var rep = await v_OrderInfoRepository.Update(oneinfo); + if (rep) + { + DingHookHelper.DingTalkHookMessage("支付回调成功", oneinfo.out_trade_no + ":修改为VIP"); + //修改用户信息 修改为VIp + var customerinfo = await v_CustomerInfoRepository.QueryById(oneinfo.CustomerId); + customerinfo.IsVIP = true; + customerinfo.VipCode = oneinfo.CardNo; + await v_CustomerInfoRepository.Update(customerinfo); + + var oldorderlist = await v_OrderInfoRepository.Query(c => c.CustomerId == oneinfo.CustomerId && c.Status == EnumOrderType.payment); + oldorderlist.ForEach(async a => + { + a.Status = EnumOrderType.Cancel; + await v_OrderInfoRepository.Update(a); + }); + //支付成功后根据用户code找到对应用户修改vip 状态 + viewModel.message = "SUCCESS"; + viewModel.code = "OK"; + } + else + { + + DingHookHelper.DingTalkHookMessage("回调PayNotify", "在自有平台未找到该订单号" + decryptModel.out_trade_no); + viewModel.message = "在自有平台未找到该订单号"; + viewModel.code = "FAIL"; + } + + return viewModel; + } + + viewModel.code = "FAIL"; + viewModel.message = "数据解密失败"; + return new WxPayCallbackViewModel(); + } + + + /// + /// 暂时不用有bug + /// + /// + /// + [HttpPost] + [AllowAnonymous] + public async Task NewPayNotify(WeChatPayCallobject model) + { + DingHookHelper.DingTalkHookMessage("开始回调PayNotify", "开始回调PayNotify"); + + // 处理微信支付回调数据 + if (model.event_type == "TRANSACTION.SUCCESS") + { + DingHookHelper.DingTalkHookMessage("result_code", "SUCCESS"); + + + + + + + + + + // 订单支付成功处理逻辑 + var info = await v_OrderInfoRepository.Query(x => x.out_trade_no == ""); + if (info.Count <= 0) + { + DingHookHelper.DingTalkHookMessage("回调PayNotify", "在自有平台未找到该订单号" + ""); + //WebHookHelper.WebHookmarkdownSend("支付结果中微信订单号不存在"); + return Content("\"return_code\", \"FAIL\""); + } + var oneinfo = info.FirstOrDefault(); + oneinfo.Status = EnumOrderType.payoff; + var rep = await v_OrderInfoRepository.Update(oneinfo); + if (rep) + { + DingHookHelper.DingTalkHookMessage("支付回调成功", oneinfo.out_trade_no + ":修改为VIP"); + //修改用户信息 修改为VIp + var customerinfo = await v_CustomerInfoRepository.QueryById(oneinfo.CustomerId); + customerinfo.IsVIP = true; + customerinfo.VipCode = oneinfo.CardNo; + await v_CustomerInfoRepository.Update(customerinfo); + + var oldorderlist = await v_OrderInfoRepository.Query(c => c.CustomerId == oneinfo.CustomerId && c.Status == EnumOrderType.payment); + oldorderlist.ForEach(async a => + { + a.Status = EnumOrderType.Cancel; + await v_OrderInfoRepository.Update(a); + }); + //支付成功后根据用户code找到对应用户修改vip 状态 + return Ok("SUCCESS"); + } + else + { + // string attach = data.GetValue("attach").ToString(); + // WebHookHelper.WebHookmarkdownSend(attach); + DingHookHelper.DingTalkHookMessage("回调PayNotify", "在自有平台未找到该订单号" + ""); + //res.SetValue("return_code", "FAIL"); + //res.SetValue("return_msg", "在自有平台未找到该订单号"); + return Content("\"return_code\", \"FAIL\""); + } + + + + + } + //else if (model.result_code == "FAIL") + //{ + // DingHookHelper.DingTalkHookMessage("result_code", "订单支付失败处理逻辑"); + // 订单支付失败处理逻辑... + //} + + return Content("SUCCESS"); + } } + + + public class WeChatPayCallobject + { + public string id { get; set; } + public DateTime create_time { get; set; } + public string resource_type { get; set; } + public string event_type { get; set; } + public string summary { get; set; } + public Resource resource { get; set; } + } + + public class Resource + { + public string original_type { get; set; } + public string algorithm { get; set; } + public string ciphertext { get; set; } + public string associated_data { get; set; } + public string nonce { get; set; } + } + + + public class WeChatPayCallbackModel + { + public string return_code { get; set; } + public string return_msg { get; set; } + public string appid { get; set; } + public string mch_id { get; set; } + public string nonce_str { get; set; } + public string sign { get; set; } + public string result_code { get; set; } + public string openid { get; set; } + public string is_subscribe { get; set; } + public string trade_type { get; set; } + public string bank_type { get; set; } + public string total_fee { get; set; } + public string fee_type { get; set; } + public string transaction_id { get; set; } + public string out_trade_no { get; set; } + public string attach { get; set; } + public string time_end { get; set; } + } } diff --git a/New_College.Api/New_College.Model.xml b/New_College.Api/New_College.Model.xml index 749efbe..95c1509 100644 --- a/New_College.Api/New_College.Model.xml +++ b/New_College.Api/New_College.Model.xml @@ -3750,6 +3750,26 @@ 备注 + + + 院校基础数量 + + + + + 适合我的大学饼图数据 + + + + + 标签 + + + + + 学校数量 + + 微信小程序配置 @@ -4735,6 +4755,11 @@ 电话 + + + + + 根据卡号查询 @@ -7740,6 +7765,139 @@ 招生计划Id列表逗号隔开 + + + 返回状态码,错误码,SUCCESS为清算机构接收成功,其他错误码为失败。 + + + + + 返回信息,如非空,为错误原因。 + + + + + 微信支付结果回调通知实体 + + + + + 通知的唯一ID + + + + + 通知创建时间,格式为YYYY-MM-DDTHH:mm:ss+TIMEZONE,YYYY-MM-DD表示年月日,T出现在字符串中,表示time元素的开头,HH:mm:ss.表示时分秒,TIMEZONE表示时区(+08:00表示东八区时间,领先UTC 8小时,即北京时间)。例如:2015-05-20T13:29:35+08:00表示北京时间2015年05月20日13点29分35秒。 + + + + + 通知的类型,支付成功通知的类型为TRANSACTION.SUCCESS + + + + + 通知的资源数据类型,支付成功通知为encrypt-resource + + + + + 通知资源数据,json格式 + + + + + 回调摘要 + + + + + 微信支付回调通知结果resource实体 + + + + + 对开启结果数据进行加密的加密算法,目前只支持AEAD_AES_256_GCM + + + + + Base64编码后的开启/停用结果数据密文 + + + + + 附加数据 + + + + + 原始回调类型,为transaction + + + + + 加密使用的随机串 + + + + + 微信支付回调通知结果解密实体 + + + + + 直连商户申请的公众号或移动应用appid + + + + + 商户的商户号,由微信支付生成并下发。 + + + + + 商户系统内部订单号,只能是数字、大小写字母_-*且在同一个商户号下唯一。特殊规则:最小字符长度为6 + + + + + 微信支付系统生成的订单号。 + + + + + 交易状态,枚举值: + SUCCESS:支付成功 + REFUND:转入退款 + NOTPAY:未支付 + CLOSED:已关闭 + REVOKED:已撤销(付款码支付) + USERPAYING:用户支付中(付款码支付) + PAYERROR:支付失败(其他原因,如银行返回失败) + ACCEPT:已接收,等待扣款 + + + + + 交易状态描述 + + + + + 支付者信息 + + + + + 支付用户信息实体 + + + + + 用户在直连商户appid下的唯一标识。 + + 职位名称 diff --git a/New_College.Api/New_College.xml b/New_College.Api/New_College.xml index d9ed6bc..c56e570 100644 --- a/New_College.Api/New_College.xml +++ b/New_College.Api/New_College.xml @@ -120,6 +120,13 @@ 服务器接口,因为是模板生成,所以首字母是大写的,自己可以重构下 + + + 智能填报预览图 + + + + 查询扩缩招院校招生计划详情 @@ -1003,12 +1010,19 @@ - + 支付返回值 + + + 暂时不用有bug + + + + 服务器接口,因为是模板生成,所以首字母是大写的,自己可以重构下 diff --git a/New_College.Api/appsettings.Development.json b/New_College.Api/appsettings.Development.json index a88a82a..e10888e 100644 --- a/New_College.Api/appsettings.Development.json +++ b/New_College.Api/appsettings.Development.json @@ -234,7 +234,7 @@ // 为微信支付商户平台的APIv3密钥,请注意不是API密钥,v3接口必填 "APIv3Key": "brapuk6fon0wachiMlth2t3lb4a0h7ji", //回调地址 - "NotifyUrl": "https://pay.ycymedu.com/api/notify/transactions", + "NotifyUrl": "https://zytb.ycymedu.com/api/front/WeixinPay/PayNotify", "PrivateKey": "/cert/apiclient_cert.p12", //(新)证书私钥 "SerialNumber": "1B304596B953D156B37863FF52FCAE40B458C9F2" //(新)证书序列号 } diff --git a/New_College.Api/appsettings.json b/New_College.Api/appsettings.json index fcf6d58..f95d486 100644 --- a/New_College.Api/appsettings.json +++ b/New_College.Api/appsettings.json @@ -234,7 +234,7 @@ // 为微信支付商户平台的APIv3密钥,请注意不是API密钥,v3接口必填 "APIv3Key": "brapuk6fon0wachiMlth2t3lb4a0h7ji", //回调地址 - "NotifyUrl": "https://pay.ycymedu.com/api/notify/transactions", + "NotifyUrl": "https://zytb.ycymedu.com/api/front/WeixinPay/PayNotify", "PrivateKey": "cert/apiclient_cert.p12", //(新)证书私钥 "SerialNumber": "1B304596B953D156B37863FF52FCAE40B458C9F2" //(新)证书序列号 } diff --git a/New_College.Common/Helper/AesGcmHelper.cs b/New_College.Common/Helper/AesGcmHelper.cs new file mode 100644 index 0000000..1881086 --- /dev/null +++ b/New_College.Common/Helper/AesGcmHelper.cs @@ -0,0 +1,36 @@ +using Org.BouncyCastle.Crypto.Engines; +using Org.BouncyCastle.Crypto.Modes; +using Org.BouncyCastle.Crypto.Parameters; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace New_College.Common.Helper +{ + public class AesGcmHelper + { + private static string ALGORITHM = "AES/GCM/NoPadding"; + private static int TAG_LENGTH_BIT = 128; + private static int NONCE_LENGTH_BYTE = 12; + //private static string AES_KEY = "yourkeyhere";//换成你的API V3密钥 + + public static string AesGcmDecrypt(string associatedData, string nonce, string ciphertext,string AES_KEY) + { + GcmBlockCipher gcmBlockCipher = new GcmBlockCipher(new AesEngine()); + AeadParameters aeadParameters = new AeadParameters( + new KeyParameter(Encoding.UTF8.GetBytes(AES_KEY)), + 128, + Encoding.UTF8.GetBytes(nonce), + Encoding.UTF8.GetBytes(associatedData)); + gcmBlockCipher.Init(false, aeadParameters); + + byte[] data = Convert.FromBase64String(ciphertext); + byte[] plaintext = new byte[gcmBlockCipher.GetOutputSize(data.Length)]; + int length = gcmBlockCipher.ProcessBytes(data, 0, data.Length, plaintext, 0); + gcmBlockCipher.DoFinal(plaintext, length); + return Encoding.UTF8.GetString(plaintext); + } + } +} diff --git a/New_College.Common/Helper/QrCodeHelper.cs b/New_College.Common/Helper/QrCodeHelper.cs index 0d57d0a..0e9f839 100644 --- a/New_College.Common/Helper/QrCodeHelper.cs +++ b/New_College.Common/Helper/QrCodeHelper.cs @@ -6,9 +6,8 @@ using System.Linq; using System.Net.NetworkInformation; using System.Text; using System.Threading.Tasks; -using ZXing; -using ZXing.Common; - +using QRCoder; +using RestSharp.Extensions; namespace New_College.Common { public static class QrCodeHelper @@ -18,61 +17,25 @@ namespace New_College.Common /// /// /// - public static MemoryStream GerQrCodeStream(string url) + public static byte[] GerQrCodeStream(string url) { - BitMatrix bitMatrix = new MultiFormatWriter().encode(url, BarcodeFormat.QR_CODE, 300, 300); - var bw = new ZXing.BarcodeWriterPixelData(); - var pixelData = bw.Write(bitMatrix); - var bitmap = new System.Drawing.Bitmap(pixelData.Width, pixelData.Height, System.Drawing.Imaging.PixelFormat.Format32bppRgb); - var fileStream = new MemoryStream(); - var bitmapData = bitmap.LockBits(new System.Drawing.Rectangle(0, 0, pixelData.Width, pixelData.Height), System.Drawing.Imaging.ImageLockMode.WriteOnly, System.Drawing.Imaging.PixelFormat.Format32bppRgb); - try - { - // we assume that the row stride of the bitmap is aligned to 4 byte multiplied by the width of the image - System.Runtime.InteropServices.Marshal.Copy(pixelData.Pixels, 0, bitmapData.Scan0, pixelData.Pixels.Length); - } - finally - { - bitmap.UnlockBits(bitmapData); - } + // 创建 QRCodeGenerator 实例 + QRCodeGenerator qrGenerator = new QRCodeGenerator(); - fileStream.Flush();//.net core 必须要加 - fileStream.Position = 0;//.net core 必须要加 + // 创建 QRCodeData 实例 + QRCodeData qrCodeDataObject = qrGenerator.CreateQrCode(url, QRCodeGenerator.ECCLevel.Q); - bitmap.Save(fileStream, System.Drawing.Imaging.ImageFormat.Png); + // 创建 PngByteQRCode 实例 + PngByteQRCode qrCode = new PngByteQRCode(qrCodeDataObject); - fileStream.Seek(0, SeekOrigin.Begin); - return fileStream; + // 获取二维码图片的字节数组 + var qrCodeImageBytes = qrCode.GetGraphic(8); // 图片大小 + + + return qrCodeImageBytes; } - /// - /// 获取文字图片信息 - /// - /// - /// - public static MemoryStream GetTextImageStream(string text) - { - MemoryStream fileStream = new MemoryStream(); - var fontSize = 14; - var wordLength = 0; - for (int i = 0; i < text.Length; i++) - { - byte[] bytes = Encoding.Default.GetBytes(text.Substring(i, 1)); - wordLength += bytes.Length > 1 ? 2 : 1; - } - using (var bitmap = new System.Drawing.Bitmap(wordLength * fontSize + 20, 14 + 40, System.Drawing.Imaging.PixelFormat.Format32bppRgb)) - { - using (Graphics g = Graphics.FromImage(bitmap)) - { - g.ResetTransform();//重置图像 - g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias; - g.DrawString(text, new Font("宋体", fontSize, FontStyle.Bold), Brushes.White, 10, 10); - bitmap.Save(fileStream, System.Drawing.Imaging.ImageFormat.Png); - } - } - fileStream.Seek(0, SeekOrigin.Begin); - return fileStream; - } + } } \ No newline at end of file diff --git a/New_College.Common/Helper/WeChatPaySignatureValidatorHelper.cs b/New_College.Common/Helper/WeChatPaySignatureValidatorHelper.cs new file mode 100644 index 0000000..7af2b59 --- /dev/null +++ b/New_College.Common/Helper/WeChatPaySignatureValidatorHelper.cs @@ -0,0 +1,73 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Security.Cryptography; +using System.Text; +using System.Threading.Tasks; + +namespace New_College.Common.Helper +{ + + public class WeChatPaySignatureValidator + { + private readonly string appId; + private readonly string mchId; + private readonly string apiKey; + + //public WeChatPaySignatureValidator(string appId, string mchId, string apiKey) + //{ + // this.appId = appId; + // this.mchId = mchId; + // this.apiKey = apiKey; + //} + + public static bool VerifySignature(string returnCode, string returnMsg, string appId, string mchId, string nonceStr, string sign, string resultCode) + { + // 获取微信支付回调的全部参数,包括商户自定义参数等。 + var allParams = new SortedDictionary + { + {"return_code", returnCode}, + {"return_msg", returnMsg}, + {"appid", appId}, + {"mch_id", mchId}, + {"nonce_str", nonceStr}, + {"sign", sign}, + {"result_code", resultCode} + // 这里可以添加其他商户自定义的参数,并按照字典序排序。 + }; + + // 将所有参数按照键值对的形式拼接成一个字符串。 + var strToBeSigned = JoinByKey(allParams); + + // 验证签名,如果验证通过则返回true,否则返回false。 + return CheckSignature(strToBeSigned, WeixinConfig.APIv3Key); + } + + private static string JoinByKey(SortedDictionary dict) + { + var sb = new StringBuilder(); + foreach (var kv in dict) + { + sb.Append(kv.Key); + sb.Append("="); + sb.Append(kv.Value); + sb.Append("&"); + } + // 去掉最后一个"&"字符。 + if (sb.Length > 0) sb.Length -= 1; + return sb.ToString(); + } + + private static bool CheckSignature(string strToBeSigned, string apiSecret) + { + // 使用商户的API密钥进行签名验证。这里使用SHA256算法进行加密。 + using (var sha256 = SHA256.Create()) + { + var dataToBeSigned = Encoding.UTF8.GetBytes(strToBeSigned); + var dataSigned = sha256.ComputeHash(dataToBeSigned); + var dataSignedBase64 = Convert.ToBase64String(dataSigned); + return apiSecret == dataSignedBase64; // 这里将签名结果与商户的API密钥进行比对。如果比对成功,则签名验证通过。 + } + } + } +} diff --git a/New_College.Common/Helper/WeChatPayV3Helper.cs b/New_College.Common/Helper/WeChatPayV3Helper.cs index bef8d20..b075ee1 100644 --- a/New_College.Common/Helper/WeChatPayV3Helper.cs +++ b/New_College.Common/Helper/WeChatPayV3Helper.cs @@ -26,10 +26,10 @@ namespace New_College.Common.Helper /// 扫码支付-Native下单API /// /// - public static async Task QrCodePay(string outorderNo, decimal Price, string title) + public static async Task QrCodePay(string outorderNo, decimal Price, string title) { ////使用 Native 支付,输出二维码并展示 - MemoryStream fileStream = null;//输出图片的URL + byte[] fileStream = null;//输出图片的URL var price = (int)(Price * 100); var name = title + "-扫码支付"; WechatPayHelper.pay_config = new WechatPayConfig() @@ -60,7 +60,7 @@ namespace New_College.Common.Helper } else { - fileStream = QrCodeHelper.GetTextImageStream("Native Pay 未能通过签名验证,无法显示二维码"); + // fileStream = QrCodeHelper.GetTextImageStream("Native Pay 未能通过签名验证,无法显示二维码"); } return fileStream; } diff --git a/New_College.Common/New_College.Common.csproj b/New_College.Common/New_College.Common.csproj index 8b8e689..ce4b55c 100644 --- a/New_College.Common/New_College.Common.csproj +++ b/New_College.Common/New_College.Common.csproj @@ -22,6 +22,7 @@ + @@ -30,7 +31,6 @@ - diff --git a/New_College.IServices/IV_OrderInfoServices.cs b/New_College.IServices/IV_OrderInfoServices.cs index 3552368..3403aed 100644 --- a/New_College.IServices/IV_OrderInfoServices.cs +++ b/New_College.IServices/IV_OrderInfoServices.cs @@ -16,7 +16,7 @@ namespace New_College.IServices { - Task QrCodePay(WeChatPayTransactionsNativeQuery viewModel); + Task QrCodePay(WeChatPayTransactionsNativeQuery viewModel); Task CreateOrder(UniOrderQuery query); diff --git a/New_College.Model/ViewModels/AIPerviewDto.cs b/New_College.Model/ViewModels/AIPerviewDto.cs new file mode 100644 index 0000000..c9d8868 --- /dev/null +++ b/New_College.Model/ViewModels/AIPerviewDto.cs @@ -0,0 +1,47 @@ +using NPOI.OpenXmlFormats.Dml.Diagram; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace New_College.Model.ViewModels +{ + public class AIPerviewDto + { + /// + /// 院校基础数量 + /// + public List universities { get; set; } + + /// + /// 适合我的大学饼图数据 + /// + public List pieChats { get; set; } + + + } + + public class PieChatsDto + { + public string name { get; set; } + + public int value { get; set; } + + } + + + public class UniversityPerviewDto + { + /// + /// 标签 + /// + public string Name { get; set; } + + /// + /// 学校数量 + /// + public int Count { get; set; } + + } +} diff --git a/New_College.Model/ViewModels/Query/OrderInfoQuery.cs b/New_College.Model/ViewModels/Query/OrderInfoQuery.cs index 7eabaa9..4f25467 100644 --- a/New_College.Model/ViewModels/Query/OrderInfoQuery.cs +++ b/New_College.Model/ViewModels/Query/OrderInfoQuery.cs @@ -93,6 +93,11 @@ namespace New_College.Model.ViewModels /// public string Phone { get; set; } + /// + /// + /// + public DateTime CreateTime { get; set; } + } public class SearchOrderQuery : BasePageRequest diff --git a/New_College.Model/ViewModels/WxPayCallbackViewModel.cs b/New_College.Model/ViewModels/WxPayCallbackViewModel.cs new file mode 100644 index 0000000..8f21054 --- /dev/null +++ b/New_College.Model/ViewModels/WxPayCallbackViewModel.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace New_College.Model.ViewModels +{ + public class WxPayCallbackViewModel + { + + /// + /// 返回状态码,错误码,SUCCESS为清算机构接收成功,其他错误码为失败。 + /// + public string code { set; get; } = "SUCCESS"; + + /// + /// 返回信息,如非空,为错误原因。 + /// + public string message { set; get; } = string.Empty; + } +} diff --git a/New_College.Model/ViewModels/WxPayNotifyModel.cs b/New_College.Model/ViewModels/WxPayNotifyModel.cs new file mode 100644 index 0000000..f706e58 --- /dev/null +++ b/New_College.Model/ViewModels/WxPayNotifyModel.cs @@ -0,0 +1,136 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace New_College.Model.ViewModels +{ + /// + /// 微信支付结果回调通知实体 + /// + public class WxPayNotifyModel + { + /// + /// 通知的唯一ID + /// + public string id { set; get; } + + /// + /// 通知创建时间,格式为YYYY-MM-DDTHH:mm:ss+TIMEZONE,YYYY-MM-DD表示年月日,T出现在字符串中,表示time元素的开头,HH:mm:ss.表示时分秒,TIMEZONE表示时区(+08:00表示东八区时间,领先UTC 8小时,即北京时间)。例如:2015-05-20T13:29:35+08:00表示北京时间2015年05月20日13点29分35秒。 + /// + public string create_time { set; get; } + + /// + /// 通知的类型,支付成功通知的类型为TRANSACTION.SUCCESS + /// + public string event_type { set; get; } + + /// + /// 通知的资源数据类型,支付成功通知为encrypt-resource + /// + public string resource_type { set; get; } + + /// + /// 通知资源数据,json格式 + /// + public WxPayResourceModel resource { set; get; } + + /// + /// 回调摘要 + /// + public string summary { set; get; } + } + + /// + /// 微信支付回调通知结果resource实体 + /// + public class WxPayResourceModel + { + /// + /// 对开启结果数据进行加密的加密算法,目前只支持AEAD_AES_256_GCM + /// + public string algorithm { set; get; } + + /// + /// Base64编码后的开启/停用结果数据密文 + /// + public string ciphertext { set; get; } + + /// + /// 附加数据 + /// + public string associated_data { set; get; } + + /// + /// 原始回调类型,为transaction + /// + public string original_type { set; get; } + + /// + /// 加密使用的随机串 + /// + public string nonce { set; get; } + } + + /// + /// 微信支付回调通知结果解密实体 + /// + public class WxPayResourceDecryptModel + { + /// + /// 直连商户申请的公众号或移动应用appid + /// + public string appid { set; get; } + + /// + /// 商户的商户号,由微信支付生成并下发。 + /// + public string mchid { set; get; } + + /// + /// 商户系统内部订单号,只能是数字、大小写字母_-*且在同一个商户号下唯一。特殊规则:最小字符长度为6 + /// + public string out_trade_no { set; get; } + + /// + /// 微信支付系统生成的订单号。 + /// + public string transaction_id { set; get; } + + /// + /// 交易状态,枚举值: + /// SUCCESS:支付成功 + /// REFUND:转入退款 + /// NOTPAY:未支付 + /// CLOSED:已关闭 + /// REVOKED:已撤销(付款码支付) + /// USERPAYING:用户支付中(付款码支付) + /// PAYERROR:支付失败(其他原因,如银行返回失败) + /// ACCEPT:已接收,等待扣款 + /// + public string trade_state { get; set; } + + /// + /// 交易状态描述 + /// + public string trade_state_desc { get; set; } + + /// + /// 支付者信息 + /// + public WxPayerResourceDecryptModel payer { set; get; } + + } + + /// + /// 支付用户信息实体 + /// + public class WxPayerResourceDecryptModel + { + /// + /// 用户在直连商户appid下的唯一标识。 + /// + public string openid { get; set; } + } +} diff --git a/New_College.Services/D_PlanMajorDescServices.cs b/New_College.Services/D_PlanMajorDescServices.cs index 18860aa..13c13b2 100644 --- a/New_College.Services/D_PlanMajorDescServices.cs +++ b/New_College.Services/D_PlanMajorDescServices.cs @@ -64,7 +64,7 @@ namespace New_College.Services int endscore = request.Score + 15; int qyear = request.Year >= 2023 ? 2023 : request.Year; var batlist = await _batchlineRepository.Query(c => c.Year == request.Year && c.Type_name == "综合"); - request.BatchName = batlist.Where(c => c.Average <= request.Score&&c.Batch_name== "普通类一段").Any() ? "普通类一段": "普通类二段"; + request.BatchName = batlist.Where(c => c.Average <= request.Score && c.Batch_name == "普通类一段").Any() ? "普通类一段" : "普通类二段"; Expression> expression = Expressionable.Create() .And(c => c.Years == qyear) .And(c => c.IsDelete == false) @@ -120,7 +120,7 @@ namespace New_College.Services var responselist = query.data.Select(c => new AIGOResponse() { AreaName = c.AreaName, - Rank = c.OrderSort > 9999 ? "--" : c.OrderSort.ToString(), + Rank = c.Rank > 9999 ? "--" : c.Rank.ToString(), _985 = c._985, _211 = c._211, _SYL = c._SYL, diff --git a/New_College.Services/V_CustomerInfoServices.cs b/New_College.Services/V_CustomerInfoServices.cs index 8a6f56b..4321a73 100644 --- a/New_College.Services/V_CustomerInfoServices.cs +++ b/New_College.Services/V_CustomerInfoServices.cs @@ -90,7 +90,7 @@ namespace New_College.Services info.Expectedscore = query.Score; info.Subject = query.Subject; info.Subjectgroup = query.Subjectgroup; - info.subjectgroupName=query.subjectgroupName; + info.subjectgroupName = query.subjectgroupName; var result = await _dal.Update(info); if (result) { @@ -241,6 +241,7 @@ namespace New_College.Services AreaName = info.AreaName, Datainit = info.Datainit, Expectedscore = info.Expectedscore, + Phone = info.Phone, Rank = info.Rank, IsVIP = info.IsVIP, Subject = info.Subject, diff --git a/New_College.Services/V_OrderInfoServices.cs b/New_College.Services/V_OrderInfoServices.cs index c46811b..1860c9a 100644 --- a/New_College.Services/V_OrderInfoServices.cs +++ b/New_College.Services/V_OrderInfoServices.cs @@ -59,7 +59,7 @@ namespace New_College.Services /// 扫码支付-Native下单API /// /// - public async Task QrCodePay(WeChatPayTransactionsNativeQuery viewModel) + public async Task QrCodePay(WeChatPayTransactionsNativeQuery viewModel) { var orderNo = OrderGenerateHelper.GenerateOrderNo("ZY");//outorderNo//系统创建订单逻辑 Random rd = new Random(); @@ -107,14 +107,17 @@ namespace New_College.Services } else { - return QrCodeHelper.GetTextImageStream("baseResult<0无法显示二维码"); + // return QrCodeHelper.GetTextImageStream("baseResult<0无法显示二维码"); + + return new byte[0]; } } catch (System.Exception ex) { _unitOfWork.RollbackTran(); // response.msg = "订单创建失败"; - return QrCodeHelper.GetTextImageStream(ex.Message); + // return QrCodeHelper.GetTextImageStream(ex.Message); + throw ex; } @@ -299,38 +302,24 @@ namespace New_College.Services success = false, msg = "获取失败" }; - var idsCard = info.data.Select(x => x.CardTypeId).ToList(); - var idsCoustomer = info.data.Select(x => x.CustomerId).ToList(); - var listCard = await v_VipCardTypeRepository.Query(x => idsCard.Contains(x.Id) && x.IsDelete == false); - var listCoustomer = await v_CustomerInfoRepository.Query(x => idsCoustomer.Contains(x.Id) && x.IsDelete == false); PageModel pageModel = new PageModel() { }; List list = new List() { }; foreach (var item in info.data) { - var CardOne = listCard.Where(x => x.Id == item.CardTypeId).FirstOrDefault(); - if (CardOne == null) - continue; - var CoustomerOne = listCoustomer.Where(x => x.Id == item.CustomerId).FirstOrDefault(); - if (CoustomerOne == null) - continue; - list.Add(new OrderInfoQuery() { CardId = item.Id, PayPrice = item.PayPrice, Price = item.Price, CardNo = item.CardNo, - CardTypeName = CardOne.Name, OrderId = item.OrderId, - CustomerName = CoustomerOne.NickName, Name = item.Name, //支付状态 StatusName = item.Status.GetDescription(), out_trade_no = item.out_trade_no, //支付方式 PayTypeName = item.PayType.GetDescription(), - - Phone = CoustomerOne.Phone, + CreateTime = item.CreateTime.Value }); } pageModel.data = list;