/// <summary> /// 当业务失败时,使用消费参数退款 /// </summary> /// <param name="consumeResult"></param> /// <returns></returns> public ServiceResult <POSReturn> Refund(POSReturn consumeResult) { ServiceResult <POSReturn> resultRefund = null; if (consumeResult != null) { if (consumeResult.dtPayMode == Constant.PayWays.Ali || consumeResult.dtPayMode == Constant.PayWays.WeChat) { resultRefund = SweepRefund(new UnionPayInput1() { Number = consumeResult.amount, Str1 = consumeResult.szOrderTrace }); } else { resultRefund = CancelConsume(new UnionPayInput1() { Number = consumeResult.amount, Str1 = consumeResult.trace }); } return(resultRefund); } else { resultRefund = new ServiceResult <POSReturn>(false, InnerError, "自动退款执行失败,消费参数为空!"); } return(resultRefund); }
/// <summary> /// 校验预结算退款参数 /// </summary> /// <param name="refundParam">预结算退款参数</param> /// <returns></returns> public ServiceResult ValidateRefundData(decimal refundBalance, POSReturn refundParam) { if (refundParam == null) { return(new ServiceResult(false, InnerError, "无法进行退款!退款参数为空")); } if (refundBalance == 0) { return(new ServiceResult(false, InnerError, "无法进行退款!退款金额为0元")); } if (refundParam.amount == 0m) { return(new ServiceResult(false, InnerError, "无法进行退款!原消费订单可退金额为0元")); } if (Math.Abs(refundBalance) > Math.Round(refundParam.amount)) { return(new ServiceResult(false, InnerError, "无法进行退款!退款金额大于交款订单可退金额")); } //POS机的微信支付宝扫码支付 if (refundParam.dtPayMode == Constant.PayWays.Ali || refundParam.dtPayMode == Constant.PayWays.WeChat) { if (string.IsNullOrEmpty(refundParam.szOrderTrace)) { return(new ServiceResult(false, InnerError, "无法进行POS机微信支付宝退款!收银流水号为空")); } } else { //退款只能针对同一种支付方式 if (refundParam.dtPayMode != Constant.PayWays.BankCard) { return(new ServiceResult(false, InnerError, "无法进行POS机退款!退款订单支付类型不支持")); } if (string.IsNullOrEmpty(refundParam.refer)) { return(new ServiceResult(false, InnerError, "无法进行POS机退款!交易参考号为空")); } if (string.IsNullOrEmpty(refundParam.trace)) { return(new ServiceResult(false, InnerError, "无法进行POS机退款!银行流水号为空")); } if (string.IsNullOrEmpty(refundParam.settleStatus)) { return(new ServiceResult(false, InnerError, "无法进行POS机退款!银联结算状态为空")); } if (string.IsNullOrEmpty(refundParam.terno)) { return(new ServiceResult(false, InnerError, "无法进行POS机退款!银联收款POS机编号为空")); } if (refundParam.refer.Length > 20) { return(new ServiceResult(false, InnerError, string.Format("无法进行POS机退款!交易参考号长度异常({0})\r\n请联系管理员查看问题", refundParam.refer))); } if (refundParam.trace.Length > 6) { return(new ServiceResult(false, InnerError, string.Format("无法进行POS机退款!银行流水号长度异常({0})\r\n请联系管理员查看问题", refundParam.trace))); } if (refundParam.settleStatus == Constant.POSSettleStatus.Settled) { if (refundParam.date.AddDays(30) < DateTime.Now) { return(new ServiceResult(false, InnerError, "退款订单已过期!退货订单离消费日期不能超过30天")); } } else { if (refundParam.settleStatus == Constant.POSSettleStatus.NotSettle) { if (Math.Abs(refundParam.amount) != Math.Abs(refundBalance)) { return(new ServiceResult(false, InnerError, "POS机消费未结算,部分退费只能在POS机结算后退费")); } else { if (MisPOSPayer.Configuration.Application == null || string.IsNullOrEmpty(MisPOSPayer.Configuration.Application.LocalPOSID)) { return(new ServiceResult(false, InnerError, "POS机本地配置为空,请检查本地配置")); } if (refundParam.terno != MisPOSPayer.Configuration.Application.LocalPOSID) { return(new ServiceResult(false, InnerError , string.Format("撤销交易只能在消费POS机上,请在原消费窗口撤销或在原消费窗口POS机结算后退费。\r\n原消费POS机编号为{0}", refundParam.terno))); } else { if (!refundParam.date.Date.Equals(DateTime.Now.Date)) { return(new ServiceResult(false, InnerError, "POS机撤销退款,只能针对当天的交易!请结算后再进行退款")); } } } } } } return(new ServiceResult()); }
/// <summary> /// 退款 /// </summary> /// <param name="refundBalance">退款金额,单位为元</param> /// <param name="paramRefund">退款附加信息</param> /// <returns></returns> public ServiceResult <POSReturn> Refund(decimal refundBalance, POSReturn paramRefund) { if (paramRefund == null) { return(new ServiceResult <POSReturn>(false, InnerError, "退款信息参数为空")); } string refundType = null; refundBalance = Math.Abs(refundBalance); #region 获取退费方式 if (paramRefund.dtPayMode == Constant.PayWays.Ali || paramRefund.dtPayMode == Constant.PayWays.WeChat) { refundType = POSTranslateCode.SWEEPREFUND; } else { if (paramRefund.settleStatus == Constant.POSSettleStatus.Settled) { refundType = POSTranslateCode.REFUND; } if (paramRefund.settleStatus == Constant.POSSettleStatus.NotSettle) { refundType = POSTranslateCode.CANCELCONSUME; } } #endregion ServiceResult <POSReturn> retRefund = null; //银行卡取消交易退款,不需要传递金额 if ((POSTranslateCode.CANCELCONSUME == refundType) || (POSTranslateCode.CANCELCONSUME != refundType && refundBalance != 0)) { switch (refundType) { case POSTranslateCode.CANCELCONSUME: retRefund = CancelConsume(new UnionPayInput1() { Number = refundBalance, Str1 = paramRefund.trace }); break; case POSTranslateCode.REFUND: retRefund = Refund(new UnionPayInput2() { Number = refundBalance, Str1 = paramRefund.date.ToString(Constant.POSDateFormat), Str2 = paramRefund.refer }); break; case POSTranslateCode.SWEEPREFUND: retRefund = SweepRefund(new UnionPayInput1() { Number = refundBalance, Str1 = paramRefund.szOrderTrace }); break; } if (retRefund.Success) { retRefund.Value.dtPayMode = paramRefund.dtPayMode; } } else { retRefund = new ServiceResult <POSReturn>(false, InnerError, "POS机退费金额异常!退费金额为0元"); } return(retRefund); }