/// <summary> /// 退款入口 /// </summary> /// <param name="para"></param> /// <returns></returns> public override RefundFeeReturnModel ProcessRefundFee(PaymentPara para) { //退款网关 string gateway = "https://mapi.alipay.com/gateway.do"; //数据初始 RefundFeeReturnModel paymentInfo = new RefundFeeReturnModel(); paymentInfo.RefundResult = RefundState.Failure; paymentInfo.RefundMode = RefundRunMode.Async; string refund_batch_no = para.out_refund_no; string strResult = string.Empty; Config _config = GetConfig(); if (_config.Sign_type.ToLower() == "md5") { //多种签名机制参与参数不一样 if (string.IsNullOrEmpty(_config.Key)) { throw new PluginException("未设置Key"); } } else { if (string.IsNullOrEmpty(_config.Private_key)) { throw new PluginException("未设置私钥"); } } Dictionary <string, string> dicPara = new Dictionary <string, string>(); //整理基础数据 dicPara.Add("service", "refund_fastpay_by_platform_pwd"); //服务固定,退款 dicPara.Add("partner", _config.Partner); //合作者ID,支付宝提供 dicPara.Add("_input_charset", _config.Input_charset); dicPara.Add("notify_url", para.notify_url); //整理业务数据 dicPara.Add("seller_user_id", _config.Partner); dicPara.Add("refund_date", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")); dicPara.Add("batch_no", refund_batch_no); dicPara.Add("batch_num", "1"); dicPara.Add("detail_data", para.pay_trade_no.Trim() + "^" + para.refund_fee.ToString("F2").Trim() + "^平台协商退款".Trim()); //要去除非格式时用“^”、“|”、“$”、“#” string refundurl = Submit.BuildRequestUrl(dicPara, _config, gateway); paymentInfo.RefundResult = RefundState.Success; paymentInfo.ResponseContentWhenFinished = refundurl; paymentInfo.RefundNo = refund_batch_no; return(paymentInfo); }
public override RefundFeeReturnModel ProcessRefundFee(PaymentPara para) { //创建请求对象 RequestHandler reqHandler = new RequestHandler(); RefundFeeReturnModel paymentInfo = new RefundFeeReturnModel(); paymentInfo.RefundMode = RefundRunMode.Sync; paymentInfo.RefundResult = RefundState.Failure; string strResult = string.Empty; Config payConfig = Utility <Config> .GetConfig(WorkDirectory); if (string.IsNullOrEmpty(payConfig.AppId)) { throw new PluginException("未设置AppId"); } if (string.IsNullOrEmpty(payConfig.MCHID)) { throw new PluginException("未设置MCHID"); } if (string.IsNullOrWhiteSpace(payConfig.pkcs12)) { throw new PluginConfigException("未设置商户证书"); } //----------------------------- //设置请求参数 //----------------------------- reqHandler.SetKey(payConfig.Key); var nonceStr = TenPayUtil.GetNoncestr(); reqHandler.SetParameter("out_trade_no", para.out_trade_no); reqHandler.SetParameter("out_refund_no", para.out_refund_no); reqHandler.SetParameter("total_fee", Convert.ToInt32((para.total_fee * 100)).ToString()); reqHandler.SetParameter("refund_fee", Convert.ToInt32((para.refund_fee * 100)).ToString()); reqHandler.SetParameter("op_user_id", payConfig.MCHID); reqHandler.SetParameter("appid", payConfig.AppId); reqHandler.SetParameter("mch_id", payConfig.MCHID); reqHandler.SetParameter("nonce_str", nonceStr); //从哪个帐号退款(余额、未结算帐号) reqHandler.SetParameter("refund_account", REFUND_SOURCE_RECHARGE_FUNDS); //REFUND_SOURCE_RECHARGE_FUNDS---可用余额退款/基本账户 string sign = reqHandler.CreateMd5Sign("key", payConfig.Key); //按约定规则生成MD5,规则参考接口文档 reqHandler.SetParameter("sign", sign); var pkcs12 = WorkDirectory + "\\" + payConfig.pkcs12; if (!System.IO.File.Exists(pkcs12)) { throw new PluginException("未找到商户证书文件"); } string strXml = reqHandler.ParseXML(); string result = string.Empty; try { result = TenPayV3.Refund(strXml, pkcs12, payConfig.MCHID);//调用统一接口 } catch (Exception ex) { throw new PluginException("原路返回退款时出错:" + ex.Message); } XDocument xmlDocument = XDocument.Parse(result); if (xmlDocument == null) { throw new PluginException("原路返回退款时出错:" + strXml); } XElement e_return = xmlDocument.Element("xml").Element("return_code"); XElement e_result = xmlDocument.Element("xml").Element("return_msg"); if (e_return == null) { throw new PluginException("原路返回退款时,返回参数异常"); } //处理返回时先判断协议错误码,再业务,最后交易状态 if (e_return.Value == "SUCCESS") { e_result = xmlDocument.Element("xml").Element("result_code"); XElement e_errdes = xmlDocument.Element("xml").Element("err_code_des"); if (e_result.Value == "SUCCESS") { //微信退款单号 string refund_id = xmlDocument.Element("xml").Element("refund_id").Value; //商户退款单号 string out_refund_no = xmlDocument.Element("xml").Element("out_refund_no").Value; //业务处理 paymentInfo.RefundResult = RefundState.Success; paymentInfo.OrderId = long.Parse(out_refund_no); paymentInfo.RefundNo = refund_id; paymentInfo.RefundTime = DateTime.Now; } else { throw new PluginException("原路返回退款时,接口返回异常:" + e_errdes.Value); } } else { throw new PluginException("原路返回退款时,接口返回异常:" + e_result.Value); } return(paymentInfo); }
public virtual PaymentInfo ProcessRefundFee(PaymentPara para) { throw new PluginException("未实现此方法"); }
/// <summary> /// 退款入口 /// </summary> /// <param name="para"></param> /// <returns></returns> public virtual RefundFeeReturnModel ProcessRefundFee(PaymentPara para) { throw new PluginException("未实现此方法"); }
public override PaymentInfo ProcessRefundFee(PaymentPara para) { RequestHandler requestHandler = new RequestHandler(); PaymentInfo paymentInfo = new PaymentInfo(); string empty = string.Empty; Config config = Utility <Config> .GetConfig(base.WorkDirectory); if (string.IsNullOrEmpty(config.AppId)) { throw new PluginException("未设置AppId"); } if (string.IsNullOrEmpty(config.MCHID)) { throw new PluginException("未设置MCHID"); } if (string.IsNullOrWhiteSpace(config.pkcs12)) { throw new PluginConfigException("未设置商户证书"); } requestHandler.SetKey(config.Key); string noncestr = TenPayUtil.GetNoncestr(); requestHandler.SetParameter("out_trade_no", para.out_trade_no); requestHandler.SetParameter("out_refund_no", para.out_refund_no); int num = Convert.ToInt32(para.total_fee * new decimal(100)); requestHandler.SetParameter("total_fee", num.ToString()); num = Convert.ToInt32(para.refund_fee * new decimal(100)); requestHandler.SetParameter("refund_fee", num.ToString()); requestHandler.SetParameter("op_user_id", config.MCHID); requestHandler.SetParameter("appid", config.AppId); requestHandler.SetParameter("mch_id", config.MCHID); requestHandler.SetParameter("nonce_str", noncestr); string str = requestHandler.CreateMd5Sign("key", config.Key); requestHandler.SetParameter("sign", str); string str1 = string.Concat(base.WorkDirectory, "\\", config.pkcs12); if (!File.Exists(str1)) { throw new PluginException("未找到商户证书文件"); } string str2 = requestHandler.ParseXML(); string empty1 = string.Empty; try { empty1 = TenPayV3.Refund(str2, str1, config.MCHID); } catch (Exception exception) { throw new PluginException(string.Concat("原路返回退款时出错:", exception.Message)); } XDocument xDocument = XDocument.Parse(empty1); if (xDocument == null) { throw new PluginException(string.Concat("原路返回退款时出错:", str2)); } XElement xElement = xDocument.Element("xml").Element("return_code"); XElement xElement1 = xDocument.Element("xml").Element("return_msg"); if (xElement == null) { throw new PluginException("原路返回退款时,返回参数异常"); } if (!(xElement.Value == "SUCCESS")) { throw new PluginException(string.Concat("原路返回退款时,接口返回异常:", xElement1.Value)); } xElement1 = xDocument.Element("xml").Element("result_code"); XElement xElement2 = xDocument.Element("xml").Element("err_code_des"); if (!(xElement1.Value == "SUCCESS")) { throw new PluginException(string.Concat("原路返回退款时,接口返回异常:", xElement2.Value)); } string value = xDocument.Element("xml").Element("refund_id").Value; string value1 = xDocument.Element("xml").Element("out_refund_no").Value; paymentInfo.OrderIds = new List <long>() { long.Parse(value1) }; paymentInfo.TradNo = value; paymentInfo.TradeTime = new DateTime?(DateTime.Now); return(paymentInfo); }
public void ConfirmRefund(long refundId, string managerRemark, string managerName) { decimal? nullable; OrderRefundInfo now = context.OrderRefundInfo.FindById <OrderRefundInfo>(refundId); if (now.RefundPayType.HasValue) { switch (now.RefundPayType.Value) { case OrderRefundInfo.OrderRefundPayType.BackOut: { if (now.RefundPayStatus.HasValue && now.RefundPayStatus.Value == OrderRefundInfo.OrderRefundPayStatus.PaySuccess) { break; } string paymentTypeGateway = now.OrderItemInfo.OrderInfo.PaymentTypeGateway; IEnumerable <Plugin <IPaymentPlugin> > plugins = from item in PluginsManagement.GetPlugins <IPaymentPlugin>(true) where item.PluginInfo.PluginId == paymentTypeGateway select item; if (plugins.Count <Plugin <IPaymentPlugin> >() <= 0) { throw new HimallException("退款时,未找到支付方式!"); } OrderPayInfo orderPayInfo = context.OrderPayInfo.FirstOrDefault((OrderPayInfo e) => e.PayState && e.OrderId == now.OrderId); IQueryable <long> nums = from item in context.OrderPayInfo where item.PayId == orderPayInfo.PayId && item.PayState select item into e select e.OrderId; decimal num = ( from o in context.OrderInfo where nums.Contains(o.Id) select o).ToList().Sum <OrderInfo>((OrderInfo e) => e.OrderTotalAmount); if (orderPayInfo == null) { throw new HimallException("退款时,未找到原支付订单信息!"); } PaymentPara paymentPara = new PaymentPara() { out_refund_no = now.Id.ToString(), out_trade_no = orderPayInfo.PayId.ToString(), refund_fee = now.Amount, total_fee = num }; PaymentPara paymentPara1 = paymentPara; PaymentInfo paymentInfo = plugins.FirstOrDefault <Plugin <IPaymentPlugin> >().Biz.ProcessRefundFee(paymentPara1); if (paymentInfo.OrderIds == null || paymentInfo.OrderIds.Count() <= 0) { break; } now.RefundPayStatus = new OrderRefundInfo.OrderRefundPayStatus?(OrderRefundInfo.OrderRefundPayStatus.PaySuccess); context.SaveChanges(); break; } case OrderRefundInfo.OrderRefundPayType.BackCapital: { if (now.RefundPayStatus.HasValue && now.RefundPayStatus.Value == OrderRefundInfo.OrderRefundPayStatus.PaySuccess) { break; } CapitalInfo capitalInfo = context.CapitalInfo.FirstOrDefault((CapitalInfo e) => e.MemId == now.UserId); OrderBO orderBO = new OrderBO(); if (capitalInfo != null) { CapitalDetailInfo capitalDetailInfo = new CapitalDetailInfo() { Amount = now.Amount, CapitalID = capitalInfo.Id, CreateTime = new DateTime?(DateTime.Now), SourceType = CapitalDetailInfo.CapitalDetailType.Refund, SourceData = now.Id.ToString(), Id = orderBO.GenerateOrderNumber() }; CapitalDetailInfo capitalDetailInfo1 = capitalDetailInfo; CapitalInfo capitalInfo1 = capitalInfo; decimal? balance = capitalInfo1.Balance; decimal amount = now.Amount; if (balance.HasValue) { nullable = new decimal?(balance.GetValueOrDefault() + amount); } else { nullable = null; } capitalInfo1.Balance = nullable; context.CapitalDetailInfo.Add(capitalDetailInfo1); } else { CapitalInfo capitalInfo2 = new CapitalInfo() { Balance = new decimal?(now.Amount), MemId = now.UserId, FreezeAmount = new decimal?(new decimal(0)), ChargeAmount = new decimal?(new decimal(0)) }; List <CapitalDetailInfo> capitalDetailInfos = new List <CapitalDetailInfo>(); CapitalDetailInfo capitalDetailInfo2 = new CapitalDetailInfo() { Amount = now.Amount, CreateTime = new DateTime?(DateTime.Now), SourceData = now.Id.ToString(), SourceType = CapitalDetailInfo.CapitalDetailType.Refund, Id = orderBO.GenerateOrderNumber() }; capitalDetailInfos.Add(capitalDetailInfo2); capitalInfo2.ChemCloud_CapitalDetail = capitalDetailInfos; capitalInfo = capitalInfo2; context.CapitalInfo.Add(capitalInfo); } now.RefundPayStatus = new OrderRefundInfo.OrderRefundPayStatus?(OrderRefundInfo.OrderRefundPayStatus.PaySuccess); context.SaveChanges(); break; } } } if (now.ManagerConfirmStatus != OrderRefundInfo.OrderRefundConfirmStatus.UnConfirm) { throw new HimallException("只有未确认状态的退款/退货才能进行确认操作"); } now.ManagerConfirmStatus = OrderRefundInfo.OrderRefundConfirmStatus.Confirmed; now.ManagerConfirmDate = DateTime.Now; now.ManagerRemark = managerRemark; OrderOperationLogInfo orderOperationLogInfo = new OrderOperationLogInfo() { Operator = managerName, OrderId = now.OrderId, OperateDate = DateTime.Now, OperateContent = "确认退款/退货" }; context.OrderOperationLogInfo.Add(orderOperationLogInfo); UserMemberInfo userMemberInfo = context.UserMemberInfo.FindById <UserMemberInfo>(now.UserId); OrderInfo orderInfo = context.OrderInfo.FindById <OrderInfo>(now.OrderId); decimal orderTotalAmount = orderInfo.OrderTotalAmount - orderInfo.Freight; decimal amount1 = now.Amount - (orderInfo.IntegralDiscount * (now.Amount / orderTotalAmount)); amount1 = Math.Round(amount1, 2); if (amount1 > new decimal(0)) { OrderInfo refundTotalAmount = orderInfo; refundTotalAmount.RefundTotalAmount = refundTotalAmount.RefundTotalAmount + amount1; if (orderInfo.RefundTotalAmount > orderTotalAmount) { orderInfo.RefundTotalAmount = orderTotalAmount; } } if (now.RefundMode != OrderRefundInfo.OrderRefundMode.OrderRefund) { MemberIntegralExchangeRules integralChangeRule = Instance <IMemberIntegralService> .Create.GetIntegralChangeRule(); if (integralChangeRule != null) { int moneyPerIntegral = integralChangeRule.MoneyPerIntegral; int num1 = (int)Math.Floor(now.Amount / moneyPerIntegral); MemberIntegral memberIntegral = userMemberInfo.ChemCloud_MemberIntegral.FirstOrDefault(); int num2 = (memberIntegral == null ? 0 : memberIntegral.AvailableIntegrals); if (num1 > 0 && num2 > 0 && orderInfo.OrderStatus == OrderInfo.OrderOperateStatus.Finish) { MemberIntegralRecord memberIntegralRecord = new MemberIntegralRecord() { UserName = userMemberInfo.UserName, MemberId = userMemberInfo.Id, RecordDate = new DateTime?(DateTime.Now), TypeId = MemberIntegral.IntegralType.Others }; object[] id = new object[] { "售后编号【", now.Id, "】退款应扣除积分", num1.ToString() }; memberIntegralRecord.ReMark = string.Concat(id); num1 = (num1 > num2 ? num2 : num1); num1 = -num1; IConversionMemberIntegralBase conversionMemberIntegralBase = Instance <IMemberIntegralConversionFactoryService> .Create.Create(MemberIntegral.IntegralType.Others, num1); Instance <IMemberIntegralService> .Create.AddMemberIntegral(memberIntegralRecord, conversionMemberIntegralBase); } } } context.SaveChanges(); MessageOrderInfo messageOrderInfo = new MessageOrderInfo() { OrderId = orderInfo.Id.ToString(), ShopId = orderInfo.ShopId, ShopName = orderInfo.ShopName, RefundMoney = now.Amount, SiteName = Instance <ISiteSettingService> .Create.GetSiteSettings().SiteName, TotalMoney = orderInfo.OrderTotalAmount }; Task.Factory.StartNew(() => Instance <IMessageService> .Create.SendMessageOnOrderRefund(orderInfo.UserId, messageOrderInfo)); if (orderInfo.PayDate.HasValue) { UpdateShopVisti(now, orderInfo.PayDate.Value); UpdateProductVisti(now, orderInfo.PayDate.Value); } }