支付模块完成
parent
8284b1c601
commit
3a88b98f15
|
|
@ -41,6 +41,38 @@ namespace New_College.Api.Controllers
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 智能填报预览图
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="request"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
[HttpGet]
|
||||||
|
public async Task<MessageModel<AIPerviewDto>> GetAIPerview([FromQuery] OneSubmitGoRequest request)
|
||||||
|
{
|
||||||
|
var test = (await _VolunteerTableServices.Query()).FirstOrDefault();
|
||||||
|
var pie = new List<PieChatsDto>();
|
||||||
|
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<UniversityPerviewDto>();
|
||||||
|
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<AIPerviewDto>()
|
||||||
|
{
|
||||||
|
msg = "ok",
|
||||||
|
response = new AIPerviewDto()
|
||||||
|
{
|
||||||
|
pieChats = pie,
|
||||||
|
universities = ulist
|
||||||
|
},
|
||||||
|
success = true
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 查询扩缩招院校招生计划详情
|
/// 查询扩缩招院校招生计划详情
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|
@ -272,7 +304,7 @@ namespace New_College.Api.Controllers
|
||||||
UniversityId = c.UniversityId,
|
UniversityId = c.UniversityId,
|
||||||
UniversityName = c.UniversityName,
|
UniversityName = c.UniversityName,
|
||||||
VolunteerTableId = id,
|
VolunteerTableId = id,
|
||||||
VolunteerRemark =JsonConvert.SerializeObject(c.VolunteerRemark)
|
VolunteerRemark = JsonConvert.SerializeObject(c.VolunteerRemark)
|
||||||
}).ToList();
|
}).ToList();
|
||||||
itemIds = await _VolunteerTableDetailServices.Add(itemlist);
|
itemIds = await _VolunteerTableDetailServices.Add(itemlist);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -29,7 +29,7 @@ namespace New_College.Api.Controllers
|
||||||
{
|
{
|
||||||
|
|
||||||
var filestream = await v_OrderInfoServices.QrCodePay(query);
|
var filestream = await v_OrderInfoServices.QrCodePay(query);
|
||||||
|
Response.Headers.Add("Content-Type", "image/png");
|
||||||
return File(filestream, "image/png");
|
return File(filestream, "image/png");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,7 @@ using System.Collections.Generic;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Net.Http;
|
using System.Net.Http;
|
||||||
|
using System.Security.Cryptography;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using Microsoft.AspNetCore.Authorization;
|
using Microsoft.AspNetCore.Authorization;
|
||||||
|
|
@ -158,7 +159,7 @@ namespace New_College.Api.Controllers.Front
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
[HttpPost]
|
[HttpPost]
|
||||||
[AllowAnonymous]
|
[AllowAnonymous]
|
||||||
public async Task<IActionResult> PayNotify()
|
public async Task<IActionResult> OldPayNotify()
|
||||||
{
|
{
|
||||||
logger.LogInformation("开始回调PayNotify");
|
logger.LogInformation("开始回调PayNotify");
|
||||||
DingHookHelper.DingTalkHookMessage("开始回调PayNotify", "开始回调PayNotify");
|
DingHookHelper.DingTalkHookMessage("开始回调PayNotify", "开始回调PayNotify");
|
||||||
|
|
@ -172,6 +173,7 @@ namespace New_College.Api.Controllers.Front
|
||||||
|
|
||||||
var builder = reader.ReadToEnd();
|
var builder = reader.ReadToEnd();
|
||||||
//WebHookHelper.WebHookmarkdownSend(builder.ToString());
|
//WebHookHelper.WebHookmarkdownSend(builder.ToString());
|
||||||
|
DingHookHelper.DingTalkHookMessage("xml", builder.ToString());
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
data.FromXml(builder.ToString());
|
data.FromXml(builder.ToString());
|
||||||
|
|
@ -190,15 +192,15 @@ namespace New_College.Api.Controllers.Front
|
||||||
};
|
};
|
||||||
// WebHookHelper.WebHookmarkdownSend("Check sign success");
|
// WebHookHelper.WebHookmarkdownSend("Check sign success");
|
||||||
//检查支付结果中transaction_id是否存在
|
//检查支付结果中transaction_id是否存在
|
||||||
if (!data.IsSet("transaction_id"))
|
//if (!data.IsSet("transaction_id"))
|
||||||
{
|
//{
|
||||||
DingHookHelper.DingTalkHookMessage("回调PayNotify", "支付结果中微信订单号不存在");
|
// DingHookHelper.DingTalkHookMessage("回调PayNotify", "支付结果中微信订单号不存在");
|
||||||
//若transaction_id不存在,则立即返回结果给微信支付后台
|
// //若transaction_id不存在,则立即返回结果给微信支付后台
|
||||||
res.SetValue("return_code", "FAIL");
|
// res.SetValue("return_code", "FAIL");
|
||||||
res.SetValue("return_msg", "支付结果中微信订单号不存在");
|
// res.SetValue("return_msg", "支付结果中微信订单号不存在");
|
||||||
//WebHookHelper.WebHookmarkdownSend("支付结果中微信订单号不存在");
|
// //WebHookHelper.WebHookmarkdownSend("支付结果中微信订单号不存在");
|
||||||
return Content(res.ToXml(), "text/xml");
|
// return Content(res.ToXml(), "text/xml");
|
||||||
}
|
//}
|
||||||
// 执行订单状态操作
|
// 执行订单状态操作
|
||||||
string out_trade_no = data.GetValue("out_trade_no").ToString();
|
string out_trade_no = data.GetValue("out_trade_no").ToString();
|
||||||
logger.LogInformation("开始回调PayNotify" + out_trade_no);
|
logger.LogInformation("开始回调PayNotify" + out_trade_no);
|
||||||
|
|
@ -246,7 +248,188 @@ namespace New_College.Api.Controllers.Front
|
||||||
return Content(res.ToXml(), "text/xml");
|
return Content(res.ToXml(), "text/xml");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[HttpPost]
|
||||||
|
[AllowAnonymous]
|
||||||
|
public async Task<WxPayCallbackViewModel> 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<WxPayNotifyModel>(str);
|
||||||
|
var resource = wxPayNotifyModel?.resource ?? new WxPayResourceModel();
|
||||||
|
var decryptStr = AesGcmHelper.AesGcmDecrypt(resource.associated_data, resource.nonce, resource.ciphertext, WeixinConfig.APIv3Key);
|
||||||
|
var decryptModel = JsonConvert.DeserializeObject<WxPayResourceDecryptModel>(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();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 暂时不用有bug
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="model"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
[HttpPost]
|
||||||
|
[AllowAnonymous]
|
||||||
|
public async Task<IActionResult> 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; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -3750,6 +3750,26 @@
|
||||||
备注
|
备注
|
||||||
</summary>
|
</summary>
|
||||||
</member>
|
</member>
|
||||||
|
<member name="P:New_College.Model.ViewModels.AIPerviewDto.universities">
|
||||||
|
<summary>
|
||||||
|
院校基础数量
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="P:New_College.Model.ViewModels.AIPerviewDto.pieChats">
|
||||||
|
<summary>
|
||||||
|
适合我的大学饼图数据
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="P:New_College.Model.ViewModels.UniversityPerviewDto.Name">
|
||||||
|
<summary>
|
||||||
|
标签
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="P:New_College.Model.ViewModels.UniversityPerviewDto.Count">
|
||||||
|
<summary>
|
||||||
|
学校数量
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
<member name="T:New_College.Model.ViewModels.WeixinConfig">
|
<member name="T:New_College.Model.ViewModels.WeixinConfig">
|
||||||
<summary>
|
<summary>
|
||||||
微信小程序配置
|
微信小程序配置
|
||||||
|
|
@ -4735,6 +4755,11 @@
|
||||||
电话
|
电话
|
||||||
</summary>
|
</summary>
|
||||||
</member>
|
</member>
|
||||||
|
<member name="P:New_College.Model.ViewModels.OrderInfoQuery.CreateTime">
|
||||||
|
<summary>
|
||||||
|
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
<member name="P:New_College.Model.ViewModels.SearchOrderQuery.CardNo">
|
<member name="P:New_College.Model.ViewModels.SearchOrderQuery.CardNo">
|
||||||
<summary>
|
<summary>
|
||||||
根据卡号查询
|
根据卡号查询
|
||||||
|
|
@ -7740,6 +7765,139 @@
|
||||||
招生计划Id列表逗号隔开
|
招生计划Id列表逗号隔开
|
||||||
</summary>
|
</summary>
|
||||||
</member>
|
</member>
|
||||||
|
<member name="P:New_College.Model.ViewModels.WxPayCallbackViewModel.code">
|
||||||
|
<summary>
|
||||||
|
返回状态码,错误码,SUCCESS为清算机构接收成功,其他错误码为失败。
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="P:New_College.Model.ViewModels.WxPayCallbackViewModel.message">
|
||||||
|
<summary>
|
||||||
|
返回信息,如非空,为错误原因。
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="T:New_College.Model.ViewModels.WxPayNotifyModel">
|
||||||
|
<summary>
|
||||||
|
微信支付结果回调通知实体
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="P:New_College.Model.ViewModels.WxPayNotifyModel.id">
|
||||||
|
<summary>
|
||||||
|
通知的唯一ID
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="P:New_College.Model.ViewModels.WxPayNotifyModel.create_time">
|
||||||
|
<summary>
|
||||||
|
通知创建时间,格式为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秒。
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="P:New_College.Model.ViewModels.WxPayNotifyModel.event_type">
|
||||||
|
<summary>
|
||||||
|
通知的类型,支付成功通知的类型为TRANSACTION.SUCCESS
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="P:New_College.Model.ViewModels.WxPayNotifyModel.resource_type">
|
||||||
|
<summary>
|
||||||
|
通知的资源数据类型,支付成功通知为encrypt-resource
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="P:New_College.Model.ViewModels.WxPayNotifyModel.resource">
|
||||||
|
<summary>
|
||||||
|
通知资源数据,json格式
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="P:New_College.Model.ViewModels.WxPayNotifyModel.summary">
|
||||||
|
<summary>
|
||||||
|
回调摘要
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="T:New_College.Model.ViewModels.WxPayResourceModel">
|
||||||
|
<summary>
|
||||||
|
微信支付回调通知结果resource实体
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="P:New_College.Model.ViewModels.WxPayResourceModel.algorithm">
|
||||||
|
<summary>
|
||||||
|
对开启结果数据进行加密的加密算法,目前只支持AEAD_AES_256_GCM
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="P:New_College.Model.ViewModels.WxPayResourceModel.ciphertext">
|
||||||
|
<summary>
|
||||||
|
Base64编码后的开启/停用结果数据密文
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="P:New_College.Model.ViewModels.WxPayResourceModel.associated_data">
|
||||||
|
<summary>
|
||||||
|
附加数据
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="P:New_College.Model.ViewModels.WxPayResourceModel.original_type">
|
||||||
|
<summary>
|
||||||
|
原始回调类型,为transaction
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="P:New_College.Model.ViewModels.WxPayResourceModel.nonce">
|
||||||
|
<summary>
|
||||||
|
加密使用的随机串
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="T:New_College.Model.ViewModels.WxPayResourceDecryptModel">
|
||||||
|
<summary>
|
||||||
|
微信支付回调通知结果解密实体
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="P:New_College.Model.ViewModels.WxPayResourceDecryptModel.appid">
|
||||||
|
<summary>
|
||||||
|
直连商户申请的公众号或移动应用appid
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="P:New_College.Model.ViewModels.WxPayResourceDecryptModel.mchid">
|
||||||
|
<summary>
|
||||||
|
商户的商户号,由微信支付生成并下发。
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="P:New_College.Model.ViewModels.WxPayResourceDecryptModel.out_trade_no">
|
||||||
|
<summary>
|
||||||
|
商户系统内部订单号,只能是数字、大小写字母_-*且在同一个商户号下唯一。特殊规则:最小字符长度为6
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="P:New_College.Model.ViewModels.WxPayResourceDecryptModel.transaction_id">
|
||||||
|
<summary>
|
||||||
|
微信支付系统生成的订单号。
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="P:New_College.Model.ViewModels.WxPayResourceDecryptModel.trade_state">
|
||||||
|
<summary>
|
||||||
|
交易状态,枚举值:
|
||||||
|
SUCCESS:支付成功
|
||||||
|
REFUND:转入退款
|
||||||
|
NOTPAY:未支付
|
||||||
|
CLOSED:已关闭
|
||||||
|
REVOKED:已撤销(付款码支付)
|
||||||
|
USERPAYING:用户支付中(付款码支付)
|
||||||
|
PAYERROR:支付失败(其他原因,如银行返回失败)
|
||||||
|
ACCEPT:已接收,等待扣款
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="P:New_College.Model.ViewModels.WxPayResourceDecryptModel.trade_state_desc">
|
||||||
|
<summary>
|
||||||
|
交易状态描述
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="P:New_College.Model.ViewModels.WxPayResourceDecryptModel.payer">
|
||||||
|
<summary>
|
||||||
|
支付者信息
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="T:New_College.Model.ViewModels.WxPayerResourceDecryptModel">
|
||||||
|
<summary>
|
||||||
|
支付用户信息实体
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="P:New_College.Model.ViewModels.WxPayerResourceDecryptModel.openid">
|
||||||
|
<summary>
|
||||||
|
用户在直连商户appid下的唯一标识。
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
<member name="P:New_College.Model.OccupationMapJobInfoRequest.OccupName">
|
<member name="P:New_College.Model.OccupationMapJobInfoRequest.OccupName">
|
||||||
<summary>
|
<summary>
|
||||||
职位名称
|
职位名称
|
||||||
|
|
|
||||||
|
|
@ -120,6 +120,13 @@
|
||||||
服务器接口,因为是模板生成,所以首字母是大写的,自己可以重构下
|
服务器接口,因为是模板生成,所以首字母是大写的,自己可以重构下
|
||||||
</summary>
|
</summary>
|
||||||
</member>
|
</member>
|
||||||
|
<member name="M:New_College.Api.Controllers.D_PlanMajorDescController.GetAIPerview(New_College.Model.ViewModels.OneSubmitGoRequest)">
|
||||||
|
<summary>
|
||||||
|
智能填报预览图
|
||||||
|
</summary>
|
||||||
|
<param name="request"></param>
|
||||||
|
<returns></returns>
|
||||||
|
</member>
|
||||||
<member name="M:New_College.Api.Controllers.D_PlanMajorDescController.GetMajorPlanPro(New_College.Model.ViewModels.MajorPlanProViewQuery)">
|
<member name="M:New_College.Api.Controllers.D_PlanMajorDescController.GetMajorPlanPro(New_College.Model.ViewModels.MajorPlanProViewQuery)">
|
||||||
<summary>
|
<summary>
|
||||||
查询扩缩招院校招生计划详情
|
查询扩缩招院校招生计划详情
|
||||||
|
|
@ -1003,12 +1010,19 @@
|
||||||
</summary>
|
</summary>
|
||||||
<returns></returns>
|
<returns></returns>
|
||||||
</member>
|
</member>
|
||||||
<member name="M:New_College.Api.Controllers.Front.WeixinPayController.PayNotify">
|
<member name="M:New_College.Api.Controllers.Front.WeixinPayController.OldPayNotify">
|
||||||
<summary>
|
<summary>
|
||||||
支付返回值
|
支付返回值
|
||||||
</summary>
|
</summary>
|
||||||
<returns></returns>
|
<returns></returns>
|
||||||
</member>
|
</member>
|
||||||
|
<member name="M:New_College.Api.Controllers.Front.WeixinPayController.NewPayNotify(New_College.Api.Controllers.Front.WeChatPayCallobject)">
|
||||||
|
<summary>
|
||||||
|
暂时不用有bug
|
||||||
|
</summary>
|
||||||
|
<param name="model"></param>
|
||||||
|
<returns></returns>
|
||||||
|
</member>
|
||||||
<member name="F:New_College.Api.Controllers.HighSchoolRankController._d_HighSchoolRankServices">
|
<member name="F:New_College.Api.Controllers.HighSchoolRankController._d_HighSchoolRankServices">
|
||||||
<summary>
|
<summary>
|
||||||
服务器接口,因为是模板生成,所以首字母是大写的,自己可以重构下
|
服务器接口,因为是模板生成,所以首字母是大写的,自己可以重构下
|
||||||
|
|
|
||||||
|
|
@ -234,7 +234,7 @@
|
||||||
// 为微信支付商户平台的APIv3密钥,请注意不是API密钥,v3接口必填
|
// 为微信支付商户平台的APIv3密钥,请注意不是API密钥,v3接口必填
|
||||||
"APIv3Key": "brapuk6fon0wachiMlth2t3lb4a0h7ji",
|
"APIv3Key": "brapuk6fon0wachiMlth2t3lb4a0h7ji",
|
||||||
//回调地址
|
//回调地址
|
||||||
"NotifyUrl": "https://pay.ycymedu.com/api/notify/transactions",
|
"NotifyUrl": "https://zytb.ycymedu.com/api/front/WeixinPay/PayNotify",
|
||||||
"PrivateKey": "/cert/apiclient_cert.p12", //(新)证书私钥
|
"PrivateKey": "/cert/apiclient_cert.p12", //(新)证书私钥
|
||||||
"SerialNumber": "1B304596B953D156B37863FF52FCAE40B458C9F2" //(新)证书序列号
|
"SerialNumber": "1B304596B953D156B37863FF52FCAE40B458C9F2" //(新)证书序列号
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -234,7 +234,7 @@
|
||||||
// 为微信支付商户平台的APIv3密钥,请注意不是API密钥,v3接口必填
|
// 为微信支付商户平台的APIv3密钥,请注意不是API密钥,v3接口必填
|
||||||
"APIv3Key": "brapuk6fon0wachiMlth2t3lb4a0h7ji",
|
"APIv3Key": "brapuk6fon0wachiMlth2t3lb4a0h7ji",
|
||||||
//回调地址
|
//回调地址
|
||||||
"NotifyUrl": "https://pay.ycymedu.com/api/notify/transactions",
|
"NotifyUrl": "https://zytb.ycymedu.com/api/front/WeixinPay/PayNotify",
|
||||||
"PrivateKey": "cert/apiclient_cert.p12", //(新)证书私钥
|
"PrivateKey": "cert/apiclient_cert.p12", //(新)证书私钥
|
||||||
"SerialNumber": "1B304596B953D156B37863FF52FCAE40B458C9F2" //(新)证书序列号
|
"SerialNumber": "1B304596B953D156B37863FF52FCAE40B458C9F2" //(新)证书序列号
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -6,9 +6,8 @@ using System.Linq;
|
||||||
using System.Net.NetworkInformation;
|
using System.Net.NetworkInformation;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using ZXing;
|
using QRCoder;
|
||||||
using ZXing.Common;
|
using RestSharp.Extensions;
|
||||||
|
|
||||||
namespace New_College.Common
|
namespace New_College.Common
|
||||||
{
|
{
|
||||||
public static class QrCodeHelper
|
public static class QrCodeHelper
|
||||||
|
|
@ -18,61 +17,25 @@ namespace New_College.Common
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="url"></param>
|
/// <param name="url"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
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);
|
// 创建 QRCodeGenerator 实例
|
||||||
var bitmap = new System.Drawing.Bitmap(pixelData.Width, pixelData.Height, System.Drawing.Imaging.PixelFormat.Format32bppRgb);
|
QRCodeGenerator qrGenerator = new QRCodeGenerator();
|
||||||
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);
|
// 创建 QRCodeData 实例
|
||||||
try
|
QRCodeData qrCodeDataObject = qrGenerator.CreateQrCode(url, QRCodeGenerator.ECCLevel.Q);
|
||||||
{
|
|
||||||
// we assume that the row stride of the bitmap is aligned to 4 byte multiplied by the width of the image
|
// 创建 PngByteQRCode 实例
|
||||||
System.Runtime.InteropServices.Marshal.Copy(pixelData.Pixels, 0, bitmapData.Scan0, pixelData.Pixels.Length);
|
PngByteQRCode qrCode = new PngByteQRCode(qrCodeDataObject);
|
||||||
}
|
|
||||||
finally
|
// 获取二维码图片的字节数组
|
||||||
{
|
var qrCodeImageBytes = qrCode.GetGraphic(8); // 图片大小
|
||||||
bitmap.UnlockBits(bitmapData);
|
|
||||||
|
|
||||||
|
return qrCodeImageBytes;
|
||||||
}
|
}
|
||||||
|
|
||||||
fileStream.Flush();//.net core 必须要加
|
|
||||||
fileStream.Position = 0;//.net core 必须要加
|
|
||||||
|
|
||||||
bitmap.Save(fileStream, System.Drawing.Imaging.ImageFormat.Png);
|
|
||||||
|
|
||||||
fileStream.Seek(0, SeekOrigin.Begin);
|
|
||||||
return fileStream;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 获取文字图片信息
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="text"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -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<string, string>
|
||||||
|
{
|
||||||
|
{"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<string, string> 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密钥进行比对。如果比对成功,则签名验证通过。
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -26,10 +26,10 @@ namespace New_College.Common.Helper
|
||||||
/// 扫码支付-Native下单API
|
/// 扫码支付-Native下单API
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public static async Task<MemoryStream> QrCodePay(string outorderNo, decimal Price, string title)
|
public static async Task<byte[]> QrCodePay(string outorderNo, decimal Price, string title)
|
||||||
{
|
{
|
||||||
////使用 Native 支付,输出二维码并展示
|
////使用 Native 支付,输出二维码并展示
|
||||||
MemoryStream fileStream = null;//输出图片的URL
|
byte[] fileStream = null;//输出图片的URL
|
||||||
var price = (int)(Price * 100);
|
var price = (int)(Price * 100);
|
||||||
var name = title + "-扫码支付";
|
var name = title + "-扫码支付";
|
||||||
WechatPayHelper.pay_config = new WechatPayConfig()
|
WechatPayHelper.pay_config = new WechatPayConfig()
|
||||||
|
|
@ -60,7 +60,7 @@ namespace New_College.Common.Helper
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
fileStream = QrCodeHelper.GetTextImageStream("Native Pay 未能通过签名验证,无法显示二维码");
|
// fileStream = QrCodeHelper.GetTextImageStream("Native Pay 未能通过签名验证,无法显示二维码");
|
||||||
}
|
}
|
||||||
return fileStream;
|
return fileStream;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -22,6 +22,7 @@
|
||||||
<PackageReference Include="NPOI" Version="2.6.0" />
|
<PackageReference Include="NPOI" Version="2.6.0" />
|
||||||
<PackageReference Include="OSS.Clients.Pay.Wechat" Version="2.4.0" />
|
<PackageReference Include="OSS.Clients.Pay.Wechat" Version="2.4.0" />
|
||||||
<PackageReference Include="PdfSharpCore" Version="1.3.62" />
|
<PackageReference Include="PdfSharpCore" Version="1.3.62" />
|
||||||
|
<PackageReference Include="QRCoder" Version="1.4.3" />
|
||||||
<PackageReference Include="RestSharp" Version="106.15.0" />
|
<PackageReference Include="RestSharp" Version="106.15.0" />
|
||||||
<PackageReference Include="StackExchange.Redis" Version="2.1.30" />
|
<PackageReference Include="StackExchange.Redis" Version="2.1.30" />
|
||||||
<PackageReference Include="System.IdentityModel.Tokens.Jwt" Version="6.5.0" />
|
<PackageReference Include="System.IdentityModel.Tokens.Jwt" Version="6.5.0" />
|
||||||
|
|
@ -30,7 +31,6 @@
|
||||||
<PackageReference Include="Serilog.AspNetCore" Version="3.3.0-dev-00152" />
|
<PackageReference Include="Serilog.AspNetCore" Version="3.3.0-dev-00152" />
|
||||||
<PackageReference Include="WebApiClient.Extensions.DependencyInjection" Version="2.0.3" />
|
<PackageReference Include="WebApiClient.Extensions.DependencyInjection" Version="2.0.3" />
|
||||||
<PackageReference Include="WebApiClient.JIT" Version="1.1.3" />
|
<PackageReference Include="WebApiClient.JIT" Version="1.1.3" />
|
||||||
<PackageReference Include="ZXing.Net" Version="0.16.9" />
|
|
||||||
|
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -16,7 +16,7 @@ namespace New_College.IServices
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|
||||||
Task<MemoryStream> QrCodePay(WeChatPayTransactionsNativeQuery viewModel);
|
Task<byte[]> QrCodePay(WeChatPayTransactionsNativeQuery viewModel);
|
||||||
|
|
||||||
Task<CreateOrderModel> CreateOrder(UniOrderQuery query);
|
Task<CreateOrderModel> CreateOrder(UniOrderQuery query);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 院校基础数量
|
||||||
|
/// </summary>
|
||||||
|
public List<UniversityPerviewDto> universities { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 适合我的大学饼图数据
|
||||||
|
/// </summary>
|
||||||
|
public List<PieChatsDto> pieChats { get; set; }
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public class PieChatsDto
|
||||||
|
{
|
||||||
|
public string name { get; set; }
|
||||||
|
|
||||||
|
public int value { get; set; }
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public class UniversityPerviewDto
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 标签
|
||||||
|
/// </summary>
|
||||||
|
public string Name { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 学校数量
|
||||||
|
/// </summary>
|
||||||
|
public int Count { get; set; }
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -93,6 +93,11 @@ namespace New_College.Model.ViewModels
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public string Phone { get; set; }
|
public string Phone { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
///
|
||||||
|
/// </summary>
|
||||||
|
public DateTime CreateTime { get; set; }
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public class SearchOrderQuery : BasePageRequest
|
public class SearchOrderQuery : BasePageRequest
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
{
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 返回状态码,错误码,SUCCESS为清算机构接收成功,其他错误码为失败。
|
||||||
|
/// </summary>
|
||||||
|
public string code { set; get; } = "SUCCESS";
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 返回信息,如非空,为错误原因。
|
||||||
|
/// </summary>
|
||||||
|
public string message { set; get; } = string.Empty;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -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
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 微信支付结果回调通知实体
|
||||||
|
/// </summary>
|
||||||
|
public class WxPayNotifyModel
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 通知的唯一ID
|
||||||
|
/// </summary>
|
||||||
|
public string id { set; get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 通知创建时间,格式为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秒。
|
||||||
|
/// </summary>
|
||||||
|
public string create_time { set; get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 通知的类型,支付成功通知的类型为TRANSACTION.SUCCESS
|
||||||
|
/// </summary>
|
||||||
|
public string event_type { set; get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 通知的资源数据类型,支付成功通知为encrypt-resource
|
||||||
|
/// </summary>
|
||||||
|
public string resource_type { set; get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 通知资源数据,json格式
|
||||||
|
/// </summary>
|
||||||
|
public WxPayResourceModel resource { set; get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 回调摘要
|
||||||
|
/// </summary>
|
||||||
|
public string summary { set; get; }
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 微信支付回调通知结果resource实体
|
||||||
|
/// </summary>
|
||||||
|
public class WxPayResourceModel
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 对开启结果数据进行加密的加密算法,目前只支持AEAD_AES_256_GCM
|
||||||
|
/// </summary>
|
||||||
|
public string algorithm { set; get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Base64编码后的开启/停用结果数据密文
|
||||||
|
/// </summary>
|
||||||
|
public string ciphertext { set; get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 附加数据
|
||||||
|
/// </summary>
|
||||||
|
public string associated_data { set; get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 原始回调类型,为transaction
|
||||||
|
/// </summary>
|
||||||
|
public string original_type { set; get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 加密使用的随机串
|
||||||
|
/// </summary>
|
||||||
|
public string nonce { set; get; }
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 微信支付回调通知结果解密实体
|
||||||
|
/// </summary>
|
||||||
|
public class WxPayResourceDecryptModel
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 直连商户申请的公众号或移动应用appid
|
||||||
|
/// </summary>
|
||||||
|
public string appid { set; get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 商户的商户号,由微信支付生成并下发。
|
||||||
|
/// </summary>
|
||||||
|
public string mchid { set; get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 商户系统内部订单号,只能是数字、大小写字母_-*且在同一个商户号下唯一。特殊规则:最小字符长度为6
|
||||||
|
/// </summary>
|
||||||
|
public string out_trade_no { set; get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 微信支付系统生成的订单号。
|
||||||
|
/// </summary>
|
||||||
|
public string transaction_id { set; get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 交易状态,枚举值:
|
||||||
|
/// SUCCESS:支付成功
|
||||||
|
/// REFUND:转入退款
|
||||||
|
/// NOTPAY:未支付
|
||||||
|
/// CLOSED:已关闭
|
||||||
|
/// REVOKED:已撤销(付款码支付)
|
||||||
|
/// USERPAYING:用户支付中(付款码支付)
|
||||||
|
/// PAYERROR:支付失败(其他原因,如银行返回失败)
|
||||||
|
/// ACCEPT:已接收,等待扣款
|
||||||
|
/// </summary>
|
||||||
|
public string trade_state { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 交易状态描述
|
||||||
|
/// </summary>
|
||||||
|
public string trade_state_desc { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 支付者信息
|
||||||
|
/// </summary>
|
||||||
|
public WxPayerResourceDecryptModel payer { set; get; }
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 支付用户信息实体
|
||||||
|
/// </summary>
|
||||||
|
public class WxPayerResourceDecryptModel
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 用户在直连商户appid下的唯一标识。
|
||||||
|
/// </summary>
|
||||||
|
public string openid { get; set; }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -64,7 +64,7 @@ namespace New_College.Services
|
||||||
int endscore = request.Score + 15;
|
int endscore = request.Score + 15;
|
||||||
int qyear = request.Year >= 2023 ? 2023 : request.Year;
|
int qyear = request.Year >= 2023 ? 2023 : request.Year;
|
||||||
var batlist = await _batchlineRepository.Query(c => c.Year == request.Year && c.Type_name == "综合");
|
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<Func<D_QualificationLine, bool>> expression = Expressionable.Create<D_QualificationLine>()
|
Expression<Func<D_QualificationLine, bool>> expression = Expressionable.Create<D_QualificationLine>()
|
||||||
.And(c => c.Years == qyear)
|
.And(c => c.Years == qyear)
|
||||||
.And(c => c.IsDelete == false)
|
.And(c => c.IsDelete == false)
|
||||||
|
|
@ -120,7 +120,7 @@ namespace New_College.Services
|
||||||
var responselist = query.data.Select(c => new AIGOResponse()
|
var responselist = query.data.Select(c => new AIGOResponse()
|
||||||
{
|
{
|
||||||
AreaName = c.AreaName,
|
AreaName = c.AreaName,
|
||||||
Rank = c.OrderSort > 9999 ? "--" : c.OrderSort.ToString(),
|
Rank = c.Rank > 9999 ? "--" : c.Rank.ToString(),
|
||||||
_985 = c._985,
|
_985 = c._985,
|
||||||
_211 = c._211,
|
_211 = c._211,
|
||||||
_SYL = c._SYL,
|
_SYL = c._SYL,
|
||||||
|
|
|
||||||
|
|
@ -90,7 +90,7 @@ namespace New_College.Services
|
||||||
info.Expectedscore = query.Score;
|
info.Expectedscore = query.Score;
|
||||||
info.Subject = query.Subject;
|
info.Subject = query.Subject;
|
||||||
info.Subjectgroup = query.Subjectgroup;
|
info.Subjectgroup = query.Subjectgroup;
|
||||||
info.subjectgroupName=query.subjectgroupName;
|
info.subjectgroupName = query.subjectgroupName;
|
||||||
var result = await _dal.Update(info);
|
var result = await _dal.Update(info);
|
||||||
if (result)
|
if (result)
|
||||||
{
|
{
|
||||||
|
|
@ -241,6 +241,7 @@ namespace New_College.Services
|
||||||
AreaName = info.AreaName,
|
AreaName = info.AreaName,
|
||||||
Datainit = info.Datainit,
|
Datainit = info.Datainit,
|
||||||
Expectedscore = info.Expectedscore,
|
Expectedscore = info.Expectedscore,
|
||||||
|
Phone = info.Phone,
|
||||||
Rank = info.Rank,
|
Rank = info.Rank,
|
||||||
IsVIP = info.IsVIP,
|
IsVIP = info.IsVIP,
|
||||||
Subject = info.Subject,
|
Subject = info.Subject,
|
||||||
|
|
|
||||||
|
|
@ -59,7 +59,7 @@ namespace New_College.Services
|
||||||
/// 扫码支付-Native下单API
|
/// 扫码支付-Native下单API
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="viewModel"></param>
|
/// <param name="viewModel"></param>
|
||||||
public async Task<MemoryStream> QrCodePay(WeChatPayTransactionsNativeQuery viewModel)
|
public async Task<byte[]> QrCodePay(WeChatPayTransactionsNativeQuery viewModel)
|
||||||
{
|
{
|
||||||
var orderNo = OrderGenerateHelper.GenerateOrderNo("ZY");//outorderNo//系统创建订单逻辑
|
var orderNo = OrderGenerateHelper.GenerateOrderNo("ZY");//outorderNo//系统创建订单逻辑
|
||||||
Random rd = new Random();
|
Random rd = new Random();
|
||||||
|
|
@ -107,14 +107,17 @@ namespace New_College.Services
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
return QrCodeHelper.GetTextImageStream("baseResult<0无法显示二维码");
|
// return QrCodeHelper.GetTextImageStream("baseResult<0无法显示二维码");
|
||||||
|
|
||||||
|
return new byte[0];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (System.Exception ex)
|
catch (System.Exception ex)
|
||||||
{
|
{
|
||||||
_unitOfWork.RollbackTran();
|
_unitOfWork.RollbackTran();
|
||||||
// response.msg = "订单创建失败";
|
// response.msg = "订单创建失败";
|
||||||
return QrCodeHelper.GetTextImageStream(ex.Message);
|
// return QrCodeHelper.GetTextImageStream(ex.Message);
|
||||||
|
throw ex;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -299,38 +302,24 @@ namespace New_College.Services
|
||||||
success = false,
|
success = false,
|
||||||
msg = "获取失败"
|
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<OrderInfoQuery> pageModel = new PageModel<OrderInfoQuery>() { };
|
PageModel<OrderInfoQuery> pageModel = new PageModel<OrderInfoQuery>() { };
|
||||||
List<OrderInfoQuery> list = new List<OrderInfoQuery>() { };
|
List<OrderInfoQuery> list = new List<OrderInfoQuery>() { };
|
||||||
foreach (var item in info.data)
|
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()
|
list.Add(new OrderInfoQuery()
|
||||||
{
|
{
|
||||||
CardId = item.Id,
|
CardId = item.Id,
|
||||||
PayPrice = item.PayPrice,
|
PayPrice = item.PayPrice,
|
||||||
Price = item.Price,
|
Price = item.Price,
|
||||||
CardNo = item.CardNo,
|
CardNo = item.CardNo,
|
||||||
CardTypeName = CardOne.Name,
|
|
||||||
OrderId = item.OrderId,
|
OrderId = item.OrderId,
|
||||||
CustomerName = CoustomerOne.NickName,
|
|
||||||
Name = item.Name,
|
Name = item.Name,
|
||||||
//支付状态
|
//支付状态
|
||||||
StatusName = item.Status.GetDescription(),
|
StatusName = item.Status.GetDescription(),
|
||||||
out_trade_no = item.out_trade_no,
|
out_trade_no = item.out_trade_no,
|
||||||
//支付方式
|
//支付方式
|
||||||
PayTypeName = item.PayType.GetDescription(),
|
PayTypeName = item.PayType.GetDescription(),
|
||||||
|
CreateTime = item.CreateTime.Value
|
||||||
Phone = CoustomerOne.Phone,
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
pageModel.data = list;
|
pageModel.data = list;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue