/// <summary> /// 退款处理 /// </summary> /// <param name="payType">支付方式</param> /// <param name="oldOrderId">原支付订单号</param> /// <param name="newOrderId">退款订单号</param> /// <param name="onlineNo">在线交易号、退款流水号</param> /// <param name="price">订单金额</param> /// <param name="rate">手续费率</param> /// <param name="act">收款账号</param> /// <param name="detail">退款明细</param> /// <returns></returns> public string Refund(string payType, string oldOrderId, string newOrderId, string onlineNo, string price, string rate, string act, string detail) { string msg = ""; try { string strOrderID = newOrderId; //订单编号(退、废) string strOrderOldID = oldOrderId; //原支付订单号 string strOrderOnlineNo = onlineNo; //交易号 string strPrice = price; // 退款金额 string strAct = act; //收款账号 string details = detail; //退款明细 decimal strRate = (!string.IsNullOrEmpty(rate)) ? decimal.Parse(rate) : 0.001M; //费率 bool result = false; msg = (string.IsNullOrEmpty(strPrice)) ? "请输入退款金额!" : msg; msg = (string.IsNullOrEmpty(strAct)) ? "请输入收款账号!" : msg; decimal total = (!string.IsNullOrEmpty(strPrice)) ? decimal.Parse(strPrice) : 0; //订单退款金额 total = total != 0 ? FourToFiveNum(total, 2) : total; if (payType == "1") { #region 支付宝 msg = (string.IsNullOrEmpty(strOrderOnlineNo)) ? "请输入交易号!" : msg; msg = (strOrderOnlineNo.Length != 16) ? "交易号格式错误!" : msg; if (msg == "") { PbProject.Logic.Pay.AliPay alipay = new PbProject.Logic.Pay.AliPay(false); #region 处理 decimal priceRate = total * strRate; //费率 priceRate = FourToFiveNum(priceRate, 2); decimal priceGy = total - priceRate; //供应退款 priceGy = FourToFiveNum(priceGy, 2); if (string.IsNullOrEmpty(details)) { details = strOrderOnlineNo + "^" + total.ToString("f2") + "^退款|" + act + "^^" + alipay._serveremail + "^^" + priceGy.ToString("f2") + "^退款"; } if (strOrderOnlineNo != null && strOrderOnlineNo != "") { string bno = DateTime.Now.ToString("yyyyMMddHHmmsss"); string[] strValueS = new string[3]; strValueS[0] = bno; strValueS[1] = "1"; strValueS[2] = details; //退款 result = alipay.IsRefund(strValueS); if (result == true) { msg = "数据提交成功,稍后请查询核对数据。。。"; #region 支付宝 查询退款 /* * if (msg == "") * { * string str = alipay.QueryRefundResultStr(strOrderOnlineNo); * string[] strs = str.Split('#'); * for (int i = 0; i < strs.Length; i++) * { * if (!string.IsNullOrEmpty(strs[i])) * { * string[] strss = strs[i].Split('$'); * * if (!string.IsNullOrEmpty(strss[0]) && strss[0].Contains("SUCCESS")) * { * //退款成功 * msg += "退款成功!银行卡 2 - 7个工作日到账,信用卡 2 - 14 个工作日到账!"; * break; * } * } * } * } * */ #endregion } else { msg = "数据提交失败,请检测数据格式是否有误!!!"; } } #endregion } #endregion } else if (payType == "2") { #region 快钱 msg = (string.IsNullOrEmpty(strOrderID)) ? "请输入订单号!" : msg; //订单编号(退、废) msg = (string.IsNullOrEmpty(strOrderOldID)) ? "请输入原订单号!" : msg; //原支付订单号 if (msg == "") { #region 处理 PbProject.Logic.Pay._99Bill bill = new PbProject.Logic.Pay._99Bill(false); string dataTime = DateTime.Now.ToString("yyyyMMddHHmmss"); decimal priceRate = total * strRate; //费率 priceRate = FourToFiveNum(priceRate, 2); decimal priceGy = total - priceRate; //供应退款 priceGy = FourToFiveNum(priceGy, 2); priceGy = priceGy * 100; //供应退款 priceRate = priceRate * 100; //费率 total = total * 100; //订单退款 int p1 = int.Parse(priceGy.ToString().Split('.')[0]); //供应退款 int p2 = int.Parse(priceRate.ToString().Split('.')[0]); //费率 int p3 = int.Parse(total.ToString().Split('.')[0]); //订单退款 //"1^[email protected]^5000^爱的|1^[email protected]^7000^分账1|1^[email protected]^8000^分账2"; if (string.IsNullOrEmpty(details)) { details = "1^" + bill.LinkEmail + "^" + p2.ToString() + "^Refund|1^" + strAct + "^" + p1.ToString() + "^Refund"; } string[] Details = new string[6]; Details[0] = strOrderOldID; // 订单编号(原订单号) Details[1] = p3.ToString(); // 订单金额 Details[2] = "系统退款"; //备注 Details[3] = details; Details[4] = strOrderID; // 订单编号(退废订单编号) Details[5] = dataTime; //退款流水号 string str = bill.Refund(Details); result = bill.IsRefund(str); //result = true; if (result == true) { msg = "数据提交成功,稍后请查询核对数据。。。"; } else { msg = "数据提交失败,请检测数据格式是否有误!!!"; } #endregion } #endregion } else if (payType == "3") { #region 汇付 msg = (string.IsNullOrEmpty(strOrderID)) ? "请输入订单号!" : ""; //订单编号(退、废) msg = (string.IsNullOrEmpty(strOrderOldID)) ? "请输入原订单号!" : ""; //原支付订单号 if (msg == "") { #region 处理 PbProject.Logic.Pay.ChinaPnr chinaPnr = new PbProject.Logic.Pay.ChinaPnr(false); string orderno = DateTime.Now.ToString("yyyyMMddHHmm"); string orderid = (strOrderID == strOrderOldID) ? orderno + "_" + strOrderOldID : strOrderID; //订单编号 decimal priceRate = total * strRate; //费率 priceRate = FourToFiveNum(priceRate, 2); decimal priceGy = total - priceRate; //供应退款 priceGy = FourToFiveNum(priceGy, 2); if (string.IsNullOrEmpty(details)) { details = "Agent:" + act + ":" + priceGy.ToString("f2"); } string[] Details = new string[4]; Details[0] = orderid; Details[1] = strOrderOldID; Details[2] = strPrice; Details[3] = details; string value = chinaPnr.Refund(Details[0], Details[1], Details[2], Details[3]); if (value.Contains("RespCode=000000") && value.Contains("ErrMsg=成功")) { msg = "数据提交成功,稍后请查询核对数据。。。"; } else { msg = "数据提交失败,请检测数据格式是否有误!!!"; } #endregion } #endregion } else if (payType == "4") { #region 财付通 #endregion } else { msg = "请选择支付方式"; } } catch (Exception) { } return(msg); }
/// <summary> /// 退款处理 /// </summary> /// <param name="mOrder">订单 Model</param> /// <param name="uEmployees">用户 Model</param> /// <param name="uCompany">公司 Model</param> /// <returns></returns> public bool TitckOrderRefund(Tb_Ticket_Order mOrder, User_Employees uEmployees, User_Company uCompany, out string msg) { bool result = false; msg = ""; try { if (mOrder.PayWay == 1 || mOrder.PayWay == 5) { #region 支付宝 AliPay aliPay = new AliPay(); string strTime = DateTime.Now.ToString("yyyyMMdd"); string bno = strTime + mOrder.OrderId + DateTime.Now.ToString("HHmm"); string detail_data = ""; string[] Details = new string[3]; Details[0] = bno; //批次号规则 Details[1] = "1"; //1.要退款的支付宝交易号 //2.退款参数 detail_data = mOrder.PayNo + "^" + mOrder.PayMoney.ToString("F2") + "^退款|" + ""; #region 分账信息 string tempSqlWhere = " OrderId='" + mOrder.OrderId + "'"; List <Tb_Order_PayDetail> payDetailList = new PbProject.Logic.Order.Tb_Order_PayDetailBLL().GetListBySqlWhere(tempSqlWhere); payDetailList = bill.OnLinePayDetails(payDetailList); #endregion 分账信息 Tb_Order_PayDetail payDetail = null; decimal realPayMoney = 0; for (int i = 0; i < payDetailList.Count; i++) { payDetail = payDetailList[i]; realPayMoney = payDetail.RealPayMoney; if (payDetail.PayType == "付款" || realPayMoney == 0) { continue; } detail_data += payDetail.PayAccount + "^^" + aliPay._serveremail + "^^" + realPayMoney.ToString("F2") + "^退" + payDetail.PayType + "|"; } detail_data = detail_data.TrimEnd('|'); Details[2] = detail_data; result = aliPay.IsRefund(Details); if (result) { bill.CreateBillRefundFailedLog(uEmployees, mOrder.OrderId, "提交退款成功,等待退款......"); //退款失败 } else { bill.CreateBillRefundFailedLog(uEmployees, mOrder.OrderId, "提交退款失败"); //退款失败 } #endregion } else if (mOrder.PayWay == 2 || mOrder.PayWay == 6) { #region 快钱 _99Bill _99bill = new _99Bill(); string dataTime = DateTime.Now.ToString("yyyyMMddHHmmss"); string detail_data = ""; decimal total = mOrder.PayMoney; //退款金额 int orderPrice = int.Parse((total * 100).ToString().Split('.')[0]); //退款金额 分为单位 int tempPrice = 0; #region 分账信息 string tempSqlWhere = " OrderId='" + mOrder.OrderId + "'"; List <Tb_Order_PayDetail> payDetailList = new PbProject.Logic.Order.Tb_Order_PayDetailBLL().GetListBySqlWhere(tempSqlWhere); payDetailList = bill.OnLinePayDetails(payDetailList); #endregion 分账信息 Tb_Order_PayDetail payDetail = null; decimal realPayMoney = 0; int allTempPrice = 0; for (int i = 0; i < payDetailList.Count; i++) { payDetail = payDetailList[i]; realPayMoney = payDetail.RealPayMoney; if (payDetail.PayType == "付款" || realPayMoney == 0) { continue; } tempPrice = int.Parse((realPayMoney * 100).ToString().Split('.')[0]);//退款金额 分为单位 //"1^[email protected]^5000^爱的|1^[email protected]^7000^分账1|1^[email protected]^8000^分账2"; // Details[3] = "1^" + LinkEmail + "^" + p2 + "^Refund|1^" + account + "^" + p1 + "^Refund"; detail_data += "1^" + payDetail.PayAccount + "^" + tempPrice + "^Refund|"; allTempPrice += tempPrice; } tempPrice = orderPrice - allTempPrice; detail_data += "1^" + _99bill.LinkEmail + "^" + tempPrice + "^Refund|"; //主账号退款 , 用于退款平衡 detail_data = detail_data.TrimEnd('|'); string[] Details = new string[6]; string OldOrderId = (string.IsNullOrEmpty(mOrder.OldOrderId)) ? mOrder.OrderId : mOrder.OldOrderId; Details[0] = OldOrderId; // 订单编号(原订单号) Details[1] = orderPrice.ToString(); // 订单金额 Details[2] = "系统退款"; //备注 Details[3] = detail_data; //退款明细 Details[4] = mOrder.OrderId; // 订单编号(退废订单编号) Details[5] = DateTime.Now.ToString("yyyyMMddHHmmss"); //退款流水号 string str = _99bill.Refund(Details); //PbProject.WebCommon.Log.Log.RecordLog("RefundOper", str, false, null);//日志 result = _99bill.IsRefund(str); if (result == true) { //退款成功,处理订单状态 string indexno = Details[5] + Details[4]; // 退款成功流水号 bill.CreateBillRefund(mOrder.OrderId, indexno, 2, "在线退款", "快钱退款", str); } else { //退款失败日志 bill.CreateBillRefundFailedLog(uEmployees, mOrder.OrderId, "退款失败,请检查:" + str); //退款失败 } #endregion } else if (mOrder.PayWay == 3 || mOrder.PayWay == 7) { #region 汇付 ChinaPnr chinaPnr = new ChinaPnr(); string dataTime = DateTime.Now.ToString("yyyyMMddHHmmss"); string detail_data = ""; decimal total = mOrder.PayMoney; //退款金额 #region 分账信息 string tempSqlWhere = " OrderId='" + mOrder.OrderId + "'"; List <Tb_Order_PayDetail> payDetailList = new PbProject.Logic.Order.Tb_Order_PayDetailBLL().GetListBySqlWhere(tempSqlWhere); payDetailList = bill.OnLinePayDetails(payDetailList); #endregion 分账信息 Tb_Order_PayDetail payDetail = null; decimal realPayMoney = 0; for (int i = 0; i < payDetailList.Count; i++) { payDetail = payDetailList[i]; realPayMoney = payDetail.RealPayMoney; if (payDetail.PayType == "付款" || realPayMoney == 0) { continue; } detail_data += "Agent:" + payDetail.PayAccount + ":" + realPayMoney.ToString("f2") + ";"; } detail_data = detail_data.TrimEnd(';'); string strOrderOldID = string.IsNullOrEmpty(mOrder.OldOrderId) ? mOrder.OrderId : mOrder.OldOrderId; string[] Details = new string[4]; Details[0] = mOrder.OrderId; //订单编号 Details[1] = strOrderOldID; //原订单编号 Details[2] = total.ToString(); //退款总金额 Details[3] = detail_data; //退分润数据集 string value = chinaPnr.Refund(Details[0], Details[1], Details[2], Details[3]); if (value.Contains("RespCode=000000") && value.Contains("ErrMsg=成功")) { result = true; } if (result == true) { string indexno = mOrder.OrderId; // 退款成功流水号 bill.CreateBillRefund(mOrder.OrderId, indexno, 3, "在线退款", "汇付退款", value); } else { bill.CreateBillRefundFailedLog(uEmployees, mOrder.OrderId, "退款失败,请检查:" + value); //退款失败 } #endregion } else if (mOrder.PayWay == 4 || mOrder.PayWay == 8 || mOrder.PayWay == 40) { #region 财付通 // 财付通 暂时不处理 TenPayParam tenPayParam = new TenPayParam(); //内部订单号 tenPayParam.Orderid = mOrder.OrderId; //旧订单号 if (!String.IsNullOrEmpty(mOrder.OldOrderId)) { tenPayParam.OldOrderid = mOrder.OldOrderId; } else { tenPayParam.OldOrderid = mOrder.OrderId; } //财付通交易号 tenPayParam.PayNo = mOrder.PayNo; //总金额 Tb_Ticket_Order tbTicketOrder = new PbProject.Logic.Order.Tb_Ticket_OrderBLL().GetTicketOrderByOrderId(tenPayParam.OldOrderid); if (tbTicketOrder != null) { tenPayParam.Total_Tee = (tbTicketOrder.PayMoney * 100).ToString("F0"); } else { tenPayParam.Total_Tee = (mOrder.PayMoney * 100).ToString("F0"); } tenPayParam.Date = (mOrder.PayMoney * 100).ToString("F0"); /*---------------------分账信息----------------------------*/ string detail_data = string.Format("{0}|", (mOrder.PayMoney * 100).ToString("F0")); string tempSqlWhere = " OrderId='" + mOrder.OrderId + "'"; Tb_Order_PayDetail payDetail = null; decimal realPayMoney = 0; List <Tb_Order_PayDetail> payDetailList = new PbProject.Logic.Order.Tb_Order_PayDetailBLL().GetListBySqlWhere(tempSqlWhere); /* * for (int i = 0; i < payDetailList.Count; i++) * { * payDetail = payDetailList[i]; * if (payDetail.PayType == "付款") * { * tenPayParam.BackState = payDetail.A1; * } * if (payDetail.PayType == "手续费") * { * realPayMoney = payDetail.BuyPoundage; * detail_data += string.Format("{0}^{1}|", payDetail.PayAccount, (realPayMoney * 100).ToString("F0")); * } * } */ // payDetailList = bill.OnLinePayDetails(payDetailList); for (int i = 0; i < payDetailList.Count; i++) { payDetail = payDetailList[i]; realPayMoney = payDetail.RealPayMoney; if (payDetail.PayType == "付款") { tenPayParam.BackState = payDetail.A1; continue; } detail_data += string.Format("{0}^{1}|", payDetail.PayAccount, (realPayMoney * 100).ToString("F0")); } detail_data = detail_data.TrimEnd('|'); //1000|(帐号^退款金额)| /*----------------------------------------------------------*/ //退款分账 tenPayParam.Bus_Args = detail_data; //分账退款 TenPay tenPay = new TenPay(); result = tenPay.ClientSplitRollback(tenPayParam); #endregion } else if (mOrder.PayWay == 14) { #region 账户支付 try { result = bill.CreateVirtualRefundBill(mOrder, uEmployees, uCompany, out msg); if (!result) { //退款失败记录日志 bill.CreateBillRefundFailedLog(uEmployees, mOrder.OrderId, msg); } } catch (Exception) { msg = "退款异常!"; } #endregion } else if (mOrder.PayWay == 15) { // 收银 暂时不处理 result = true; } } catch (Exception) { } return(result); }