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> GetOrder(string outOderNo, string openPlat, string sign) { try { if (string.IsNullOrEmpty(outOderNo) || string.IsNullOrEmpty(openPlat)) { return new JsonResult> { 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> { result = false, retcode = -100, retmsg = null }; } List list = new List(); 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> { result = true, retcode = 1, retmsg = list }; } return new JsonResult> { result = false, retcode = -1, retmsg = null }; } catch (Exception ex) { LogHelper.Error(ex); return new JsonResult> { result = false, retcode = -500, retmsg = null }; } } /// /// 三方平台支付 如淘牛帮 /// /// /// /// /// /// /// /// /// /// 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(); // //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() { 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() { 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> 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> { result = false, retcode = -1, retmsg = null }; } if (channel == 0) { return new JsonResult> { 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(); } return new JsonResult> { 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(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() { 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() { 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; } } } }