ComplianceServer/oldcode/ZXDService/OutOrderService.svc.cs

599 lines
29 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using CRM.Core.BLL.Application.Pay;
using CRM.Core.BLL.EventBus.EventHandlers;
using CRM.Core.BLL.Util;
using CRM.Core.BLL.Wx;
using CRM.Core.Common.EventBus;
using CRM.Core.Common.WebHelper;
using CRM.Core.DTO;
using CRM.Core.DTO.Ord;
using CRM.Core.Model.Entity;
using CRM.Core.Model.Enum;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using WX.CRM.Common;
namespace ZXDService
{
// 注意: 使用“重构”菜单上的“重命名”命令可以同时更改代码、svc 和配置文件中的类名“OutOrderService”。
// 注意: 为了启动 WCF 测试客户端以测试此服务,请在解决方案资源管理器中选择 OutOrderService.svc 或 OutOrderService.svc.cs然后开始调试。
public class OutOrderService : IOutOrderService
{
private WX_SZZYORDER_BL szzyOrder_BL = new WX_SZZYORDER_BL();
private WX_SzzyOrderPay_BL orderPay_BL = new WX_SzzyOrderPay_BL();
private readonly WX_SzzyOrderDeposit_BL _deposit = new WX_SzzyOrderDeposit_BL();
private readonly PayServices _payServices = new PayServices();
private Reward_PayInfo_BL rewardPay_BL = new Reward_PayInfo_BL();
private WX_ComplianceConfirm_BL complianceConfirm_BL = new WX_ComplianceConfirm_BL();
CACHE_BL cache_BL = new CACHE_BL();
private SecurityHelper sHelper = new SecurityHelper();
private PayServices _payService = new PayServices();
public void DoWork()
{
}
public OutOrderService()
{
EventBus.Instance.Subscribe(new PayInfoEventHandler());
EventBus.Instance.Subscribe(new SendPayMessageEventHandler());
EventBus.Instance.Subscribe(new PayOrderEventHandler());
EventBus.Instance.Subscribe(new DepositOrderEventHandler());
EventBus.Instance.Subscribe(new OrderAndPayInfoEventHandler());
}
public JsonResult<List<OutOrderDto>> GetOrder(string outOderNo, string openPlat, string sign)
{
try
{
if (string.IsNullOrEmpty(outOderNo) || string.IsNullOrEmpty(openPlat))
{
return new JsonResult<List<OutOrderDto>> { result = false, retcode = -200, retmsg = null };
}
string signStr = string.Format("{0}-{1}", outOderNo, openPlat);
signStr = AESHelper.Encrypt(signStr, "upprivilegenews1");
if (signStr != sign)
{
return new JsonResult<List<OutOrderDto>> { result = false, retcode = -100, retmsg = null };
}
List<OutOrderDto> list = new List<OutOrderDto>();
var platType = getOpenPlatType(openPlat);
var orderList = szzyOrder_BL.GetThirdOrderList(outOderNo, platType);
var orderPayList = orderPay_BL.GetListByOrderIds(orderList.Select(m => Convert.ToInt32(m.ORDERID)).ToList());
foreach (var order in orderList)
{
OutOrderDto item = new OutOrderDto();
item.orderNo = order.outorderno;
item.thridOrderNo = order.ORDERID.ToString();
item.status = order.ORDERSTATUS;
var payInfo = orderPayList.Where(m => m.orderid == order.ORDERID).FirstOrDefault();
if (payInfo != null)
{
item.merchantOrderNo = payInfo.payno;
item.totalPrice = payInfo.payprice;
item.payWay = getPayWay(payInfo.paytype);
}
list.Add(item);
}
if (list != null && list.Count > 0)
{
return new JsonResult<List<OutOrderDto>> { result = true, retcode = 1, retmsg = list };
}
return new JsonResult<List<OutOrderDto>> { result = false, retcode = -1, retmsg = null };
}
catch (Exception ex)
{
LogHelper.Error(ex);
return new JsonResult<List<OutOrderDto>> { result = false, retcode = -500, retmsg = null };
}
}
/// <summary>
/// 三方平台支付 如淘牛帮
/// </summary>
/// <param name="orderNo"></param>
/// <param name="outOderNo"></param>
/// <param name="payWay"></param>
/// <param name="merchantOrderNo"></param>
/// <param name="totalPrice"></param>
/// <param name="payName"></param>
/// <param name="payTime"></param>
/// <param name="sign"></param>
/// <returns></returns>
public Stream Notice(string orderNo, string outOderNo, string payWay, string merchantOrderNo, decimal totalPrice, string payName, long payTime, string sign)
{
try
{
LogHelper.Info("=========三方订单支付成功信息 start=============");
LogHelper.Info(string.Format("参数信息orderNo:{0},outOrderNO:{1},payWay:{2},merchantOrderNo:{3},totalPrice:{4},payName:{5},payTime:{6},sign:{7}", orderNo, outOderNo, payWay, merchantOrderNo, totalPrice, payName, payTime.ToString(), sign));
string signOrginal = string.Format("{0}-{1}-{2}-{3}", orderNo, outOderNo, merchantOrderNo, payTime.ToString());
string signEncypt = AESHelper.Encrypt(signOrginal, "upprivilegenews1");
if (sign != signEncypt)
{
var ret = new { state = -1, message = "参数错误" };
return Utility.GetStream(Utility.ObjectToJson(ret));
}
LogHelper.Info("sign加密比对成功");
var syncOrderId = Convert.ToDecimal(orderNo);
var order = szzyOrder_BL.GetModelBySzId(syncOrderId);
LogHelper.Info("查询订单数据库操作成功!");
if (order == null)
{
order = szzyOrder_BL.Get(m => m.ORDERID == syncOrderId);
if (order == null)
{
LogHelper.Info(string.Format("订单号{0}不存在", orderNo));
return Utility.GetStream(Utility.ObjectToJson(new { state = -1, message = "订单号不存在" }));
}
}
if (outOderNo != order.outorderno)
{
LogHelper.Info(string.Format("事业部订单号{0}与库中订单{1}不匹配", outOderNo, order.outorderno));
return Utility.GetStream(Utility.ObjectToJson(new { state = -1, message = "事业部订单号不匹配" }));
}
var orderId = Convert.ToInt32(order.ORDERID);
var payType = getPayType(payWay);
var payInfo1 = orderPay_BL.Get(m => m.orderid == orderId && m.payno == merchantOrderNo && m.paytype == payType && m.auditstatus == 1 && m.isdelete == 0);
var payInfo2 = _deposit.Get(m => m.payno == merchantOrderNo && m.paytype == payType && m.auditstatus == 1 && m.isdelete == 0);
LogHelper.Info("查询支付记录数据库操作成功!");
if (payInfo1 != null || payInfo2 != null)
{
LogHelper.Info(string.Format("线上订单:{0},支付流水:{1},支付类型:{2}已经存在", orderNo, merchantOrderNo, payType.ToString()));
return Utility.GetStream(Utility.ObjectToJson(new { state = -1, message = "支付流水号已经存在" }));
}
else
{
//payInfo = new WX_SzzyOrderPay();
//payInfo.orderid = orderId;
//payInfo.needpay = order.NEEDPAY.Value;
//payInfo.payprice = totalPrice; //支付成功后,这里的金额单位是元
//payInfo.payno = merchantOrderNo;
//payInfo.paytype = payType;
//var payTypeName = cache_BL.GetList_Parameter(ParameterGroup.OrderPayType).FirstOrDefault(p => p.PARAVALUE == payType.ToString()).PARANAME;
//payInfo.paytypename = payTypeName;
//payInfo.remark = payName;
//payInfo.ctime = DateTimeTool.GetTimeFromLinuxTime(payTime);
//payInfo.paydate = payInfo.ctime.Date;
//payInfo.payname = "在线支付";
//payInfo.companycode = order.companycode;
//payInfo.auditstatus = 1; //表示已经确认
//payInfo.audittime = payInfo.ctime;
//payInfo.channel = order.CHANNEL;
////写入支付记录表
//int result = orderPay_BL.Add(payInfo);
//if (result == 1)
//{
// //更新订单支付信息
// order.ARRIVALPAY = totalPrice;
// order.FINALPAY = totalPrice;
// order.ARRIVALTIME = payInfo.paydate;
// order.ORDERSTATUS = "200";
// order.ORDERSTATUSNAME = "已支付";
// szzyOrder_BL.Update(order);
// LogHelper.Info("写入支付记录和更新订单状态执行数据库操作成功!");
// //推送支付事件
// EventBus.Instance.Publish(new PayInfoEvent(Convert.ToInt32(order.ORDERID), "200", "已支付", order.NEEDPAY.Value, payInfo.paydate.Value, order.companycode, merchantOrderNo, payType, payTypeName, payInfo.remark, payInfo.payprice, payInfo.ctime, payInfo.payname));
// //EventBus.Instance.Publish(new PayOrderEvent(Convert.ToInt32(order.ORDERID), order.ORDERSTATUS, order.ORDERSTATUSNAME, order.ARRIVALPAY.Value, order.ARRIVALTIME.Value, order.companycode, payInfo.id, payInfo.auditor.Value, payInfo.auditorname, payInfo.audittime.Value));
// ////推送收款短信给订单审核人
// //var onlinePayReceiveMobile = ConfigurationManager.AppSettings["OnlinePayReceiveMobile"];
// //var resList = new List<string>();
// //if (!string.IsNullOrWhiteSpace(onlinePayReceiveMobile))
// //{
// // resList = onlinePayReceiveMobile.Split(',').ToList();
// //}
// //foreach (var resId in resList)
// //{
// // EventBus.Instance.Publish(new SendPayMessageEvent(payInfo.payprice, resId, payTypeName, 10000));
// //}
// ////推送短信结束
// LogHelper.Info(string.Format("处理成功!订单:{0},本地订单号:{1}", orderNo, order.ORDERID.ToString()));
// return Utility.GetStream(Utility.ObjectToJson(new { state = 0, message = "同步成功" }));
//}
//else
//{
// LogHelper.Info(string.Format("支付记录入库操作错误!订单:{0},本地订单号:{1}", orderNo, order.ORDERID.ToString()));
// return Utility.GetStream(Utility.ObjectToJson(new { state = -2, message = "支付记录入库操作错误" }));
//}
#region
var paylist = new List<PayInfoDto>() {
new PayInfoDto(){
resid = order.RESID,
paytype = payType,
paytypename = cache_BL.GetList_Parameter(ParameterGroup.OrderPayType).FirstOrDefault(p => p.PARAVALUE == payType.ToString()).PARANAME,
paydate = DateTimeTool.GetTimeFromLinuxTime(payTime).Date,
payname = "在线支付",
remark = payName,
payno = merchantOrderNo,
isuse = 0,
companycode = order.companycode,
tradeno = null,
creator = null,
creatorname = null,
checkpaytime=DateTimeTool.GetTimeFromLinuxTime(payTime),
payprice=totalPrice
}
};
var orderuselist = new List<OrderuseDto>() {
new OrderuseDto() { orderid = Convert.ToInt32(order.ORDERID), needpay = order.NEEDPAY.Value, arrivalpay = 0 }
};
var dto2 = new CRM.Core.DTO.Ord.PayDto2
{
orderuselist = orderuselist,
resid = order.RESID,
//depprice = depprice,
paylist = paylist
};
LogHelper.Info("dto2:" + dto2.ToJson());
var ret2 = _payServices.Add(dto2, 2);
if (ret2.result)
{
LogHelper.Info("写入支付记录和更新订单状态执行数据库操作成功!");
//支付信息写入成功之后自动调用审核
var depositInfoList = ret2.retmsg;
foreach (var deposit in depositInfoList)
{
try
{
var depositModel = _deposit.Get(p => p.id == deposit.id);
if (depositModel != null)
{
_deposit.Audit(depositModel, 0, string.Empty);
}
}
catch (Exception exx)
{
LogHelper.Error(exx);
}
}
}
#endregion
return Utility.GetStream(Utility.ObjectToJson(new { state = 0, message = "同步成功" }));
}
}
catch (Exception ex)
{
LogHelper.Error(string.Concat("执行支付信息入库错误:", ex.ToString()));
return Utility.GetStream(Utility.ObjectToJson(new { state = -500, message = "系统错误" }));
}
}
public Stream RewardNotice(string outOrderNo, string payWay, string merchantOrderNo, decimal totalPrice, string payName, long payTime, int channel, string sign)
{
try
{
LogHelper.Info("=========打赏支付成功信息 start=============");
LogHelper.Info(string.Format("参数信息outOrderNO:{0},payWay:{1},merchantOrderNo:{2},totalPrice:{3},payName:{4},payTime:{5},sign:{6},channel:{7}", outOrderNo, payWay, merchantOrderNo, totalPrice, payName, payTime.ToString(), sign, channel.ToString()));
string signOrginal = string.Format("{0}-{1}-{2}", outOrderNo, merchantOrderNo, payTime.ToString());
string signEncypt = AESHelper.Encrypt(signOrginal, "upprivilegenews1");
if (sign != signEncypt || channel == 0)
{
var ret = new { state = -1, message = "参数错误" };
return Utility.GetStream(Utility.ObjectToJson(ret));
}
LogHelper.Info("sign加密比对成功");
var payType = getPayType(payWay);
var payInfo = rewardPay_BL.Get(m => m.payno == merchantOrderNo && m.paytype == payType);
LogHelper.Info("查询支付记录数据库操作成功!");
if (payInfo != null)
{
LogHelper.Info(string.Format("打赏支付流水:{0},支付类型:{1}已经存在", merchantOrderNo, payType.ToString()));
return Utility.GetStream(Utility.ObjectToJson(new { state = -1, message = "支付流水号已经存在" }));
}
else
{
payInfo = new Reward_PayInfo();
payInfo.payprice = totalPrice; //支付成功后,这里的金额单位是元
payInfo.payno = merchantOrderNo;
payInfo.paytype = payType;
var payTypeName = cache_BL.GetList_Parameter(ParameterGroup.OrderPayType).FirstOrDefault(p => p.PARAVALUE == payType.ToString()).PARANAME;
payInfo.paytypename = payTypeName;
payInfo.remark = payName;
payInfo.outorderno = outOrderNo;
payInfo.ctime = DateTimeTool.GetTimeFromLinuxTime(payTime);
payInfo.paydate = payInfo.ctime.Date;
payInfo.payname = "在线支付";
payInfo.companycode = GetCompanyCode(channel);
payInfo.auditstatus = 1; //表示已经确认
payInfo.audittime = payInfo.ctime;
payInfo.channel = channel;
//写入支付记录表
int result = rewardPay_BL.Add(payInfo);
if (result == 1)
{
LogHelper.Info(string.Format("处理成功!流水号:{0},三方订单号:{1}", merchantOrderNo, outOrderNo));
return Utility.GetStream(Utility.ObjectToJson(new { state = 0, message = "同步成功" }));
}
else
{
LogHelper.Info(string.Format("支付记录入库操作错误!流水号:{0},三方订单号:{1}", merchantOrderNo, outOrderNo));
return Utility.GetStream(Utility.ObjectToJson(new { state = -2, message = "支付记录入库操作错误" }));
}
}
}
catch (Exception ex)
{
LogHelper.Error(string.Concat("执行打赏支付信息入库错误:", ex.ToString()));
return Utility.GetStream(Utility.ObjectToJson(new { state = -500, message = "系统错误" }));
}
}
public Stream ComplianceNotice(string orderNo, string outOrderNo, string confirmTime, string sign, string ip)
{
LogHelper.Info("=========合规回访确认 start=============");
LogHelper.Info(string.Format("参数信息orderNo:{0},outOrderNo:{1},confirmTime:{2}, sign: {3}, ip:{4}", orderNo, outOrderNo, confirmTime, sign, ip));
string signOrginal = string.Format("{0}-{1}-{2}", orderNo, outOrderNo, confirmTime);
LogHelper.Info(signOrginal);
string signEncypt = AESHelper.Encrypt(signOrginal, "upprivilegenews1");
LogHelper.Info(signEncypt);
if (sign != signEncypt)
{
var ret = new { state = -1, message = "参数错误" };
return Utility.GetStream(Utility.ObjectToJson(ret));
}
//if(string.IsNullOrEmpty(ip))
//{
// var ret = new { state = -1, message = "ip不能为空" };
// return Utility.GetStream(Utility.ObjectToJson(ret));
//}
try
{
string[] orderNos = orderNo.Split('|');
string[] outOrderNos = outOrderNo.Split('|');
string[] confirmTimes = confirmTime.Split('|');
string[] ipArr = new string[] { };
if (!string.IsNullOrEmpty(ip))
{
ipArr = ip.Split('|');
}
if (orderNos.Length == outOrderNos.Length && orderNos.Length == confirmTimes.Length && outOrderNos.Length == confirmTimes.Length)
{
var len = orderNos.Length;
for (int i = 0; i < len; i++)
{
if (!string.IsNullOrWhiteSpace(orderNos[i]))
{
LogHelper.Info(orderNos[i]);
LogHelper.Info(Convert.ToInt64(orderNos[i]).ToString());
var szzyOrderId = Convert.ToDecimal(orderNos[i]);
var order = szzyOrder_BL.Get(p => p.SZZYORDERID == szzyOrderId);
if (order != null)
{
//如果已经通过,重签就不处理
if (order.RISKCTRLSTATUS != 2)
{
if (order.RISKCTRLSTATUS == -1)
{
order.RISKCTRLSTATUS = 0;
szzyOrder_BL.Update(order);
}
}
}
var itemIp = string.Empty;
if (ipArr.Length > 0)
{
itemIp = ipArr[i];
}
var model = new WX_ComplianceConfirm { SzzyOrderId = Convert.ToInt64(szzyOrderId), OutOrderNo = outOrderNos[i], ConfirmTime = DateTimeTool.GetTimeFromLinuxTime(Convert.ToInt64(confirmTimes[i])), Ip = itemIp };
var result = complianceConfirm_BL.Add(model);
if (result > 0)
{
LogHelper.Info(orderNos[i] + "写入成功!");
}
else
{
LogHelper.Info(orderNos[i] + "写入失败!");
}
}
}
var ret = new { state = 0, message = "ok" };
return Utility.GetStream(Utility.ObjectToJson(ret));
}
else
{
var ret = new { state = -2, message = "参数长度不一致" };
return Utility.GetStream(Utility.ObjectToJson(ret));
}
}
catch (System.Data.Entity.Infrastructure.DbUpdateException exx)
{
LogHelper.Error(exx);
var ret = new { state = -500, message = "数据已经存在" };
return Utility.GetStream(Utility.ObjectToJson(ret));
}
catch (Exception ex)
{
LogHelper.Error(ex);
var ret = new { state = -500, message = "报错了,参数错误或者入库失败!" };
return Utility.GetStream(Utility.ObjectToJson(ret));
}
}
public JsonResult<List<OrderComplianceDto>> ComplianceList(int channel, string sign)
{
LogHelper.Info("=========合规未通过列表 start=============");
LogHelper.Info(string.Format("参数信息channel:{0},sign:{1}", channel.ToString(), sign));
string signOrginal = string.Format("{0}", channel.ToString());
string signEncypt = AESHelper.Encrypt(signOrginal, "upprivilegenews1");
if (sign != signEncypt)
{
return new JsonResult<List<OrderComplianceDto>> { result = false, retcode = -1, retmsg = null };
}
if (channel == 0)
{
return new JsonResult<List<OrderComplianceDto>> { result = false, retcode = -2, retmsg = null };
}
var list = szzyOrder_BL.GetList(m => m.RISKCTRLSTATUS == -1 && m.CHANNEL == channel).Select(m => new OrderComplianceDto { orderNo = m.SZZYORDERID.ToString(), outOrderNo = m.outorderno, status = m.rejectremark }).ToList();
if (list == null || list.Count == 0)
{
list = new List<OrderComplianceDto>();
}
return new JsonResult<List<OrderComplianceDto>> { result = true, retcode = 1, retmsg = list };
}
public Stream Pay(string content, string clientid, string sign)
{
var msg = string.Empty;
//验证是否非法请求
if (!sHelper.CheckClientValid(clientid, content, sign))//签名认证
{
msg = JsonHelper.ObjDivertToJson(new retMsg { result = false, retcode = (int)EnumInterfaceErrcode., retmsg = null });
msg = sHelper.encyptData(clientid, msg);
return Utility.GetStream(msg);
}
content = sHelper.decyptData(clientid, content); //解密操作
var dto = Utility.JSONToObject<CRM.Core.DTO.Ord.OutPayDto>(content);
//如果订单号跟权限单号都没有
if (string.IsNullOrEmpty(dto.szzyorderid))
{
msg = JsonHelper.ObjDivertToJson(new retMsg { result = false, retcode = (int)EnumInterfaceErrcode., retmsg = null });
msg = sHelper.encyptData(clientid, msg);
return Utility.GetStream(msg);
}
var syncOrderId = Convert.ToDecimal(dto.szzyorderid);
var order = szzyOrder_BL.GetModelBySzId(syncOrderId);
LogHelper.Info("查询订单数据库操作成功!" + order.ToJson());
if (order == null)
{
order = szzyOrder_BL.Get(m => m.ORDERID == syncOrderId);
if (order == null)
{
LogHelper.Info(string.Format("订单号{0}不存在", dto.szzyorderid));
return Utility.GetStream(sHelper.encyptData(clientid, Utility.ObjectToJson(new { state = -1, message = "订单号不存在" })));
}
}
var paylist = new List<PayInfoDto>() {
new PayInfoDto(){
resid = order.RESID,
paytype = dto.paytype,
paytypename =cache_BL.GetList_Parameter(ParameterGroup.OrderPayType).FirstOrDefault(p => p.PARAVALUE == dto.paytype.ToString()).PARANAME,
paydate = dto.paydate,
payname = dto.payname,
remark = dto.remark,
payno = dto.payno,
isuse = 0,
companycode = order.companycode,
tradeno = null,
creator = null,
creatorname = null,
checkpaytime = DateTime.Now,
payprice = dto.payprice
}
};
var orderuselist = new List<OrderuseDto>() { new OrderuseDto() { orderid = Convert.ToInt32(order.ORDERID), needpay = order.NEEDPAY.Value, arrivalpay = 0 } };
var dto2 = new CRM.Core.DTO.Ord.PayDto2
{
orderuselist = orderuselist,
resid = order.RESID,
paylist = paylist
};
LogHelper.Info("dto2:" + dto2.ToJson());
var ret = _payService.Add(dto2, 2);
LogHelper.Info("ret:" + ret.ToJson());
if (ret.result)
{
msg = JsonHelper.ObjDivertToJson(new retMsg { result = true, retcode = (int)EnumInterfaceErrcode., retmsg = "success" });
msg = sHelper.encyptData(clientid, msg);
return Utility.GetStream(msg);
}
else
{
msg = JsonHelper.ObjDivertToJson(new retMsg { result = false, retcode = (int)EnumInterfaceErrcode., retmsg = null });
msg = sHelper.encyptData(clientid, msg);
return Utility.GetStream(msg);
}
}
private int getOpenPlatType(string openPlat)
{
switch (openPlat)
{
case "tnb":
return 3;
default:
return 0;
}
}
private string GetCompanyCode(int ch)
{
var companyCode = cache_BL.GetCompanyCode();
var companyModel = companyCode.FirstOrDefault(p => p.Min <= ch && p.Max >= ch);
return companyModel != null ? companyModel.CompanyCode : "DNZZ";
}
private string getPayWay(int payType)
{
switch (payType)
{
case 1:
return "AliPay";
case 5:
return "WX";
case 11:
return "ApplePay";
case 12:
return "HuaweiPay";
case 13:
return "MeizuPay";
default:
return "";
}
}
private int getPayType(string payWay)
{
switch (payWay)
{
case "AliPay":
return 1;
case "WX":
return 5;
case "ApplePay":
return 11;
case "HuaweiPay":
return 12;
case "MeizuPay":
return 13;
default:
return 0;
}
}
}
}