Пример #1
0
        /// <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);
        }
Пример #2
0
        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);
        }
Пример #3
0
 public virtual PaymentInfo ProcessRefundFee(PaymentPara para)
 {
     throw new PluginException("未实现此方法");
 }
Пример #4
0
 /// <summary>
 /// 退款入口
 /// </summary>
 /// <param name="para"></param>
 /// <returns></returns>
 public virtual RefundFeeReturnModel ProcessRefundFee(PaymentPara para)
 {
     throw new PluginException("未实现此方法");
 }
Пример #5
0
        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);
        }
Пример #6
0
        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);
            }
        }