Exemple #1
0
        public void MapSetsDataRecorderMetaDataToReturnedObjectOfMetaDataFactoryCall()
        {
            const int organizationRoleUserCreatorId = 3;
            var       dateCreated  = new DateTime(2003, 1, 1);
            var       refundEntity = new RefundEntity {
                OrganizationRoleUserCreatorId =
                    organizationRoleUserCreatorId, DateCreated = dateCreated
            };
            var expectedDataRecorderMetaData = new DataRecorderMetaData
            {
                DataRecorderCreator = new OrganizationRoleUser(organizationRoleUserCreatorId),
                DateCreated         = dateCreated
            };

            Expect.Call(_dataRecorderMetaDataFactory.CreateDataRecorderMetaData
                            (organizationRoleUserCreatorId, dateCreated)).Return(expectedDataRecorderMetaData);

            _mocks.ReplayAll();
            Refund refund = _refundFactory.Map(refundEntity);

            _mocks.VerifyAll();

            Assert.AreEqual(expectedDataRecorderMetaData, refund.DataRecorderMetaData,
                            "Refund DataRecorderMetaData mapped incorrectly.");
        }
Exemple #2
0
        public RefundResult Refund(RefundEntity refundEntity)
        {
            RefundResult result = new RefundResult();

            result.IsSync = true;
            NetPayInfo netpayInfo = ObjectFactory <NetPayProcessor> .Instance.GetValidBySOSysNo(refundEntity.SOSysNo);

            string    partner        = AppSettingManager.GetSetting("Invoice", "IPSPartner");
            string    IPSSecurityKey = AppSettingManager.GetSetting("Invoice", "IPSSecurityKey");
            string    sign           = Sign(string.Format("{0}{1}{2}{3}{4}", partner, refundEntity.SOSysNo.ToString(), refundEntity.OrderDate.ToString("yyyyMMdd"), refundEntity.RefundAmt.ToString("f2"), IPSSecurityKey));
            RefundMsg msg            = new IPSPay.ServiceSoapClient().Refund(partner, sign, refundEntity.OrderDate.ToString("yyyyMMdd"), refundEntity.SOSysNo.ToString(), (double)refundEntity.RefundAmt, "");

            if (msg.ErrCode == "0000")
            {
                if (msg.Sign == Sign(string.Format("{0}{1}{2}{3}{4}{5}{6}", partner, msg.TradeBillNo, msg.TradeTime, msg.RealRefundAmount.ToString("f2"), msg.CanRefundAmount.ToString("f2"), msg.RefundBillNo, IPSSecurityKey)))
                {
                    result.Result = true;
                }
                else
                {
                    result.Result  = false;
                    result.Message = "验签失败";
                }
            }
            else
            {
                result.Result  = false;
                result.Message = GetMessage(msg.ErrCode);
                //result.Message += refundEntity.SOSysNo.ToString() + " " + refundEntity.OrderDate.ToString("YYYYMMDD");
            }

            return(result);
        }
Exemple #3
0
        public void MapSetsIsNewToTrueWhenGivenIdIs0()
        {
            Refund newRefund = GetValidRefund(0);

            RefundEntity refundEntity = _refundFactory.Map(newRefund);

            Assert.IsTrue(refundEntity.IsNew, "RefundEntity IsNew set to false when ID of 0 given.");
        }
Exemple #4
0
        public void MapSetsIsNewToFalseWhenGivenIdIsNot0()
        {
            Refund oldRefund = GetValidRefund(12);

            RefundEntity refundEntity = _refundFactory.Map(oldRefund);

            Assert.IsFalse(refundEntity.IsNew,
                           "RefundEntity IsNew set to true when ID that was not 0 given.");
        }
Exemple #5
0
        public void MapMapsRefundIdToEntityRefundId()
        {
            const int expectedRefundId = 43;

            RefundEntity refundEntity = _refundFactory.Map(GetValidRefund(expectedRefundId));

            Assert.AreEqual(expectedRefundId, refundEntity.RefundId,
                            "RefundEntity RefundID mapped incorrectly.");
        }
Exemple #6
0
        /// <summary>
        /// 退款
        /// 保证流水号唯一退款前缀添加R
        /// </summary>
        /// <param name="entity">退款实体信息</param>
        /// <returns>退款结果</returns>
        public RefundResult Refund(RefundEntity entity)
        {
            string refundUrl = AppSettingManager.GetSetting("Invoice", "TenPayRefundUrl");

            Dictionary <string, string> reqParams = new Dictionary <string, string>();

            reqParams["input_charset"]   = "UTF-8";
            reqParams["sign_key_index"]  = "1";
            reqParams["service_version"] = "1.1";
            reqParams["partner"]         = AppSettingManager.GetSetting("Invoice", "TenPayParnter");
            reqParams["out_trade_no"]    = entity.SOSysNo.ToString();
            reqParams["out_refund_no"]   = entity.RefundSysNo.ToString();
            reqParams["total_fee"]       = (entity.SOAmt * 100).ToString();
            reqParams["refund_fee"]      = (entity.RefundAmt * 100).ToString();
            reqParams["op_user_id"]      = AppSettingManager.GetSetting("Invoice", "TenPayParnter");
            reqParams["op_user_passwd"]  = GetMD5(AppSettingManager.GetSetting("Invoice", "TenPayParnterPwd"));
            reqParams["sign_type"]       = "MD5";
            //reqParams["notify_url"] = GetMD5(AppSettingManager.GetSetting("Invoice", "TenPayRefundNotifyUrl"));

            string reqData = "";

            string[] allKeys = reqParams.Keys.ToArray();
            Array.Sort(allKeys);
            foreach (var item in allKeys)
            {
                reqData += string.Format("{0}={1}&", item, reqParams[item]);
            }
            string sign = GetMD5(reqData + string.Format("key={0}", AppSettingManager.GetSetting("Invoice", "TenPaySecretKey")));

            reqData += string.Format("sign={0}", sign);

            var resultXml = HttpRequestReturnXml(string.Format("{0}?{1}", refundUrl, reqData), "GET", "");

            var result = new RefundResult();
            var code   = resultXml.SelectSingleNode("root/retcode").InnerText;//请求结果

            if (code == "0")
            {
                result.Result = true;
                var soSysNo = entity.SOSysNo.ToString();                                          //商户订单号
                result.ExternalKey = resultXml.SelectSingleNode("root/transaction_id").InnerText; //退款流水,支付宝国际无
                var refundAmout = entity.RefundAmt.ToString("F2");                                //退款总金额
            }
            else
            {
                result.Message = resultXml.SelectSingleNode("root/retmsg").InnerText;//拒绝原因
            }

            //记录日志
            string resultNote = string.Format("用户[{0}]对订单号:{1} 调用了退款接口.调用结果;{2} 调用返回信息:{3},{4} PostUrl:{5} ", ServiceContext.Current.UserSysNo, entity.SOSysNo, code, result.Message, resultXml.ToXmlString(), refundUrl);

            ExternalDomainBroker.CreateOperationLog(resultNote, BizLogType.RMA_Refund_Refund, entity.RefundSysNo, entity.CompanyCode);
            return(result);
        }
Exemple #7
0
        public void MapMapsNotesToEntitynotes()
        {
            const string expectedNotes = "Some Notes";
            Refund       refund        = GetValidRefund();

            refund.Notes = expectedNotes;

            RefundEntity refundEntity = _refundFactory.Map(refund);

            Assert.AreEqual(expectedNotes, refundEntity.Notes, "RefundEntity Notes mapped incorrectly.");
        }
Exemple #8
0
        public void MapSetsDateCreatedToMetaDataDateCreated()
        {
            var    expectedDateCreated = new DateTime(2001, 1, 1);
            Refund refund = GetValidRefund();

            refund.DataRecorderMetaData.DateCreated = expectedDateCreated;

            RefundEntity refundEntity = _refundFactory.Map(refund);

            Assert.AreEqual(expectedDateCreated, refundEntity.DateCreated,
                            "RefundEntity DateCreated mapped incorrectly.");
        }
Exemple #9
0
        public void MapMapsRefundReasonToEntityRefundReasonId()
        {
            const RefundReason expectedRefundReason = RefundReason.Other;
            Refund             refund = GetValidRefund();

            refund.RefundReason = expectedRefundReason;

            RefundEntity refundEntity = _refundFactory.Map(refund);

            Assert.AreEqual((short)expectedRefundReason, refundEntity.ReasonId,
                            "RefundEntity ReasonID mapped incorrectly.");
        }
Exemple #10
0
        public void MapSetsOrganizationRoleUserCreatorIdToDataRecorderCreatorId()
        {
            const int expectedOrganizationRoleUserCreatorId = 32882;
            Refund    refund = GetValidRefund();

            refund.DataRecorderMetaData.DataRecorderCreator.Id = expectedOrganizationRoleUserCreatorId;

            RefundEntity refundEntity = _refundFactory.Map(refund);

            Assert.AreEqual(expectedOrganizationRoleUserCreatorId, refundEntity.
                            OrganizationRoleUserCreatorId,
                            "RevenueEntity OrganizationRoleUserCreatorId mapped incorrectly.");
        }
Exemple #11
0
        /// <summary>
        /// 退款
        /// 保证流水号唯一退款前缀添加R
        /// </summary>
        /// <param name="entity">退款实体信息</param>
        /// <returns>退款结果</returns>
        public RefundResult Refund(RefundEntity entity)
        {
            string refundUrl = AppSettingManager.GetSetting("Invoice", "RefundUrl");
            string bgUrl     = AppSettingManager.GetSetting("Invoice", "BGURL");

            VendorCustomsInfo customsInfo = ObjectFactory <ISOBizInteract> .Instance.LoadVendorCustomsInfo(entity.SOSysNo);

            Dictionary <string, string> reqParams = new Dictionary <string, string>();

            reqParams["SRC_NCODE"] = customsInfo.CBTSRC_NCode;
            reqParams["BILL_NO"]   = entity.SOSysNo.ToString();

            reqParams["REFUND_AMOUNT"] = entity.RefundAmt.ToString("F2");
            reqParams["CARGO_AMOUNT"]  = entity.ProductAmount.GetValueOrDefault().ToString("F2");

            reqParams["TRANSPORT_AMOUNT"] = entity.ShippingFeeAmount.GetValueOrDefault().ToString("F2");
            reqParams["TAX_AMOUNT"]       = entity.TaxFeeAmount.GetValueOrDefault().ToString("F2");
            reqParams["RDO_TIME"]         = string.Empty;
            reqParams["BGURL"]            = bgUrl;

            StringBuilder reqXml = new StringBuilder();

            reqXml.Append("<?xml version=\"1.0\" encoding=\"UTF-8\"?><EasipayB2CRequest><ReqData>");
            foreach (KeyValuePair <string, string> kvp in reqParams)
            {
                reqXml.AppendFormat("<{0}><![CDATA[{1}]]></{0}>", kvp.Key, kvp.Value);
            }
            reqXml.Append("</ReqData></EasipayB2CRequest>");
            var resultXml = HttpPostRequestReturnXml(refundUrl, BuildPostReqData(reqXml.ToString(), customsInfo));

            var result = new RefundResult();
            var code   = resultXml.SelectSingleNode("EasipayB2CResponse/ResData/RTN_CODE").InnerText;     //请求结果

            result.Message = resultXml.SelectSingleNode("EasipayB2CResponse/ResData/RTN_INFO").InnerText; //拒绝原因

            if (code == "000000")
            {
                result.Result = true;
                var soSysNo = resultXml.SelectSingleNode("EasipayB2CResponse/ResData/BILL_NO").InnerText;                                   //商户订单号
                result.ExternalKey = string.Format("R" + resultXml.SelectSingleNode("/EasipayB2CResponse/ResData/REFTRX_SERNO").InnerText); //退款流水
                var refundAmout = resultXml.SelectSingleNode("EasipayB2CResponse/ResData/REFUND_AMOUNT").InnerText;                         //退款总金额
            }

            //记录日志
            string resultNote = string.Format("用户[{0}]对订单号:{1} 调用了退款接口.调用结果;{2} 调用返回信息:{3},{4} PostUrl:{5} ", ServiceContext.Current.UserSysNo, entity.SOSysNo, code, result.Message, resultXml.ToXmlString(), refundUrl);

            ExternalDomainBroker.CreateOperationLog(resultNote, BizLogType.RMA_Refund_Refund, entity.RefundSysNo, entity.CompanyCode);
            return(result);
        }
Exemple #12
0
        /// <summary>
        /// 退款
        /// 保证流水号唯一退款前缀添加R
        /// </summary>
        /// <param name="entity">退款实体信息</param>
        /// <returns>退款结果</returns>
        public RefundResult Refund(RefundEntity entity)
        {
            string refundUrl = AppSettingManager.GetSetting("Invoice", "RefundUrl");
            string bgUrl     = AppSettingManager.GetSetting("Invoice", "BGURL");

            Dictionary <string, string> reqParams = new Dictionary <string, string>();

            reqParams["SRC_NCODE"] = AppSettingManager.GetSetting("Invoice", "SRC_NCODE");
            reqParams["BILL_NO"]   = entity.SOSysNo.ToString();

            reqParams["REFUND_AMOUNT"] = entity.RefundAmt.ToString("F2");
            reqParams["CARGO_AMOUNT"]  = entity.ProductAmount.GetValueOrDefault().ToString("F2");

            reqParams["TRANSPORT_AMOUNT"] = entity.ShippingFeeAmount.GetValueOrDefault().ToString("F2");
            reqParams["TAX_AMOUNT"]       = entity.TaxFeeAmount.GetValueOrDefault().ToString("F2");
            reqParams["RDO_TIME"]         = string.Empty;
            reqParams["BGURL"]            = bgUrl;

            StringBuilder reqXml = new StringBuilder();

            reqXml.Append("<?xml version=\"1.0\" encoding=\"UTF-8\"?><EasipayB2CRequest><ReqData>");
            foreach (KeyValuePair <string, string> kvp in reqParams)
            {
                reqXml.AppendFormat("<{0}><![CDATA[{1}]]></{0}>", kvp.Key, kvp.Value);
            }
            reqXml.Append("</ReqData></EasipayB2CRequest>");
            var resultXml = HttpPostRequestReturnXml(refundUrl, BuildPostReqData(reqXml.ToString()));

            var result = new RefundResult();
            var code   = resultXml.SelectSingleNode("EasipayB2CResponse/ResData/RTN_CODE").InnerText;     //请求结果

            result.Message = resultXml.SelectSingleNode("EasipayB2CResponse/ResData/RTN_INFO").InnerText; //拒绝原因

            if (code == "000000")
            {
                result.Result = true;
                var soSysNo = resultXml.SelectSingleNode("EasipayB2CResponse/ResData/BILL_NO").InnerText;                                   //商户订单号
                result.ExternalKey = string.Format("R" + resultXml.SelectSingleNode("/EasipayB2CResponse/ResData/REFTRX_SERNO").InnerText); //退款流水
                var refundAmout = resultXml.SelectSingleNode("EasipayB2CResponse/ResData/REFUND_AMOUNT").InnerText;                         //退款总金额
            }

            //记录日志
            string resultNote = string.Format("用户[{0}]对订单号:{1} 调用了退款接口.调用结果;{2} 调用返回信息:{3},{4} PostUrl:{5} ", entity.UserSysNo, entity.SOSysNo, code, result.Message, resultXml.ToXmlString(), refundUrl);

            ECommerce.Utility.Logger.WriteLog(resultNote, "EasiPayUtils.Refund");

            return(result);
        }
Exemple #13
0
        private static RefundResult ProcessNetWorkRefund(SOIncomeInfo entity, SOInfo soInfo)
        {
            var           result      = new RefundResult();
            List <string> payTypeList = CodeNamePairManager.GetList("Inventory", "ChinaPayPayTypeList").Select(p => p.Code).ToList();

            if (payTypeList.Contains(soInfo.Payment.PayTypeID.ToString()))
            {
                var biz          = new IPSPayUtils();
                var refundEntity = new RefundEntity
                {
                    SOSysNo     = soInfo.SOSysNo,
                    RefundSysNo = entity.OrderSysNo.Value,
                    RefundAmt   = Math.Abs(entity.IncomeAmt.Value),
                    CompanyCode = entity.CompanyCode,
                    OrderDate   = soInfo.OrderDate.Value
                };
                refundEntity.ProductAmount = Math.Abs(entity.IncomeAmt.Value)
                                             - soInfo.Amount.ShipPrice
                                             - soInfo.TariffAmt;
                refundEntity.TaxFeeAmount      = soInfo.TariffAmt;
                refundEntity.ShippingFeeAmount = soInfo.Amount.ShipPrice;


                if (soInfo.Payment.PayTypeID >= 200 && soInfo.Payment.PayTypeID < 300)
                {
                    result = biz.Refund(refundEntity);
                }
                else
                {
                    throw new BusinessException("未实现此支付方式");
                }
            }
            else
            {
                result.Result = false;

                result.Message = ("支付方式" + soInfo.Payment.PayTypeName + "不支持网关直退。");
            }
            return(result);
        }
 public void InputDate(DataTable dt)
 {
     if (dt != null || dt.Rows.Count > 0)
     {
         List <RefundEntity> listRefund = new List <RefundEntity>();
         foreach (DataRow item in dt.Rows)
         {
             var refundInfo = new RefundEntity();
             refundInfo.IGrowID    = Guid.NewGuid().ToString();
             refundInfo.OnRefund00 = item[0].ToString();
             refundInfo.OnRefund01 = item[1].ToString();
             refundInfo.OnRefund02 = item[2].ToString();
             refundInfo.OnRefund03 = DataConvert.DateTimeConvert(item[3].ToString());
             refundInfo.OnRefund04 = item[4].ToString();
             refundInfo.OnRefund05 = DataConvert.DateTimeConvert(item[5].ToString());
             refundInfo.OnRefund06 = item[6].ToString();
             refundInfo.OnRefund07 = Convert.ToDouble(item[7].ToString());
             refundInfo.OnRefund08 = item[8].ToString();
             refundInfo.OnRefund09 = Convert.ToDouble(item[9].ToString());
             refundInfo.OnRefund10 = item[10].ToString();
             refundInfo.OnRefund11 = item[11].ToString();
             refundInfo.OnRefund12 = DataConvert.DateTimeConvert(item[12].ToString());
             refundInfo.OnRefund13 = DataConvert.DateTimeConvert(item[13].ToString());
             refundInfo.OnRefund14 = item[14].ToString();
             refundInfo.OnRefund15 = item[15].ToString();
             refundInfo.OnRefund16 = item[16].ToString();
             refundInfo.OnRefund17 = item[17].ToString();
             refundInfo.OnRefund18 = item[18].ToString();
             refundInfo.OnRefund19 = item[19].ToString();
             refundInfo.OnRefund20 = item[20].ToString();
             refundInfo.OnRefund21 = item[21].ToString();
             refundInfo.OnRefund22 = item[22].ToString();
             refundInfo.OnRefund23 = item[23].ToString();
             refundInfo.OnRefund24 = item[24].ToString();
             refundInfo.OnRefund25 = item[25].ToString();
             refundInfo.OnRefund26 = item[26].ToString();
             refundInfo.OnRefund27 = item[27].ToString();
             refundInfo.OnRefund28 = item[28].ToString();
             refundInfo.OnRefund29 = item[29].ToString();
             refundInfo.OnRefund30 = item[30].ToString();
             refundInfo.OnRefund31 = item[31].ToString();
             refundInfo.OnRefund32 = item[32].ToString();
             refundInfo.OnRefund33 = item[33].ToString();
             refundInfo.OnRefund34 = item[34].ToString();
             refundInfo.OnRefund35 = item[35].ToString();
             refundInfo.OnRefund36 = item[36].ToString();
             refundInfo.OnRefund37 = item[37].ToString();
             refundInfo.OnRefund38 = item[38].ToString();
             //refundInfo.Description = item[].ToString();
             refundInfo.CreateDate    = DateTime.Now;
             refundInfo.CreatorUserId = "";
             refundInfo.ModifyDate    = null;
             refundInfo.ModifyUserId  = "";
             refundInfo.DeleteMark    = true;
             refundInfo.DeleteTime    = null;
             refundInfo.DeleteUserId  = "";
             listRefund.Add(refundInfo);
         }
         service.Insert(listRefund);
     }
 }
Exemple #15
0
        public RefundResult Refund(RefundEntity entity)
        {
            BizLogType RefoundLogType = BizLogType.RMA_Refund_Refund;

            if (entity.OrderType.GetValueOrDefault() == SOIncomeOrderType.AO)
            {
                RefoundLogType = BizLogType.AO_Refund_Refund;
            }
            BizLogType RefountType = BizLogType.AO_Refund_Refund;

            ExternalDomainBroker.CreateOperationLog("支付宝退款开始构建请求参数", RefoundLogType, entity.RefundSysNo, entity.CompanyCode);
            RefundResult responseResult = null;

            #region 无密退款
            ////////////////////////////////////////////请求参数////////////////////////////////////////////

            //服务器异步通知页面路径
            string notify_url = string.Empty;
            //需http://格式的完整路径,不允许加?id=123这类自定义参数

            //退款批次号
            string batch_no = DateTime.Now.ToString("yyyyMMddHHmmssfff");
            //必填,每进行一次即时到账批量退款,都需要提供一个批次号,必须保证唯一性

            //退款请求时间
            string refund_date = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
            //必填,格式为:yyyy-MM-dd hh:mm:ss

            //退款总笔数
            string batch_num = "1";
            //必填,即参数detail_data的值中,“#”字符出现的数量加1,最大支持1000笔(即“#”字符出现的最大数量999个)

            //单笔数据集
            string     detail_data = "";
            NetPayInfo netpayInfo  = ObjectFactory <NetPayProcessor> .Instance.GetValidBySOSysNo(entity.SOSysNo);

            if (netpayInfo != null && !string.IsNullOrWhiteSpace(netpayInfo.ExternalKey))
            {
                //退款详细数据
                detail_data += BuildDetailDataString(netpayInfo.ExternalKey.TrimEnd(), entity.RefundAmt.ToString("f2"), "支付宝无线支付退款");
            }
            //必填,格式详见“4.3 单笔数据集参数说明”


            ////////////////////////////////////////////////////////////////////////////////////////////////
            #endregion

            #region 请求参数 :
            //////////////////////////////////////////////请求参数////////////////////////////////////////////
            ////服务器异步通知页面路径
            //string notify_url = string.Empty;
            ////需http://格式的完整路径,不允许加?id=123这类自定义参数

            ////卖家支付宝帐户
            //string seller_email = "*****@*****.**";

            ////卖家UserID:
            //string seller_user_id = Config.Partner;

            ////退款当天日期
            //string refund_date = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
            ////必填,格式:年[4位]-月[2位]-日[2位] 小时[2位 24小时制]:分[2位]:秒[2位],如:2007-10-01 13:13:13

            ////批次号
            //string batch_no = DateTime.Now.ToString("yyyyMMddHHmmssfff");
            ////必填,格式:当天日期[8位]+序列号[3至24位],如:201008010000001

            ////退款笔数
            //string batch_num = entity.Count.ToString() ;
            ////必填,参数detail_data的值中,“#”字符出现的数量加1,最大支持1000笔(即“#”字符出现的数量999个)
            //string detail_data = "";
            //foreach (var item in entity)
            //{
            //    NetPayInfo netpayInfo = ObjectFactory<NetPayProcessor>.Instance.GetValidBySOSysNo(item.SOSysNo);
            //    if (netpayInfo!=null&&!string.IsNullOrWhiteSpace(netpayInfo.ExternalKey))
            //    {
            //        //退款详细数据
            //        detail_data += BuildDetailDataString(netpayInfo.ExternalKey.TrimEnd(), item.RefundAmt.ToString("f2"), "支付宝无线支付退款");
            //    }
            //}

            ////必填,具体格式请参见接口技术文档
            //if (string.IsNullOrWhiteSpace(detail_data))
            //{
            //    return responseResult = new RefundResult()
            //    {
            //        Result = false,
            //        Message = "报错:无有效退款订单"
            //    };

            //}
            //else
            //{
            //    detail_data=detail_data.Remove(detail_data.Length - 1);
            //}

            //////////////////////////////////////////////////////////////////////////////////////////////////
            #endregion

            //把请求参数打包成数组
            SortedDictionary <string, string> sParaTemp = new SortedDictionary <string, string>();
            sParaTemp.Add("partner", Config.Partner);
            sParaTemp.Add("_input_charset", Config.Input_charset.ToLower());
            sParaTemp.Add("service", "refund_fastpay_by_platform_nopwd");
            sParaTemp.Add("notify_url", notify_url);
            sParaTemp.Add("batch_no", batch_no);
            sParaTemp.Add("refund_date", refund_date);
            sParaTemp.Add("batch_num", batch_num);
            sParaTemp.Add("detail_data", detail_data);
            ExternalDomainBroker.CreateOperationLog("开支请求支付宝退款。", RefoundLogType, entity.RefundSysNo, entity.CompanyCode);
            //建立请求
            string sHtmlText = Submit.BuildRequest(sParaTemp);

            ExternalDomainBroker.CreateOperationLog(sHtmlText, RefoundLogType, entity.RefundSysNo, entity.CompanyCode);
            //请在这里加上商户的业务逻辑程序代码

            //——请根据您的业务逻辑来编写程序(以下代码仅作参考)——

            XmlDocument xmlDoc = new XmlDocument();
            try
            {
                xmlDoc.LoadXml(sHtmlText);
                string strXmlResponse = xmlDoc.SelectSingleNode("/alipay").InnerText;
                string result         = xmlDoc.SelectSingleNode("/alipay/is_success").InnerText;
                if (result == "F")
                {
                    string resultNote = string.Format("用户[{0}]对订单号:{1} 调用了退款接口.调用结果;{2} 调用返回信息:{3} PostUrl:{4} 退款金额:{5}", ServiceContext.Current.UserSysNo, entity.SOSysNo, "False", strXmlResponse, Submit.GATEWAY_NEW, entity.RefundAmt.ToString());
                    ExternalDomainBroker.CreateOperationLog(resultNote, RefoundLogType, entity.RefundSysNo, entity.CompanyCode);
                    Exception refundException = new Exception(strXmlResponse);
                    return(responseResult = new RefundResult()
                    {
                        Result = false,
                        Message = strXmlResponse
                    });
                }
                else
                {
                    string resultNote = string.Format("用户[{0}]对订单号:{1} 调用了退款接口.调用结果;{2} 调用返回信息:{3} PostUrl:{4} 退款金额:{5}", ServiceContext.Current.UserSysNo, entity.SOSysNo, "True", strXmlResponse, Submit.GATEWAY_NEW, entity.RefundAmt.ToString());
                    ExternalDomainBroker.CreateOperationLog(resultNote, RefoundLogType, entity.RefundSysNo, entity.CompanyCode);
                    return(responseResult = new RefundResult()
                    {
                        Result = true,
                        ExternalKey = strXmlResponse
                    });
                }
            }
            catch (Exception exp)
            {
                string resultNote = string.Format("用户[{0}]对订单号:{1} 调用了退款接口.调用结果;{2} 调用返回信息:{3} PostUrl:{4} 退款金额:{5}", ServiceContext.Current.UserSysNo, entity.SOSysNo, "False", exp.Message, Submit.GATEWAY_NEW, entity.RefundAmt.ToString());
                ExternalDomainBroker.CreateOperationLog(resultNote, RefoundLogType, entity.RefundSysNo, entity.CompanyCode);
                return(responseResult = new RefundResult()
                {
                    Result = false,
                    Message = exp.Message
                });
            }

            //——请根据您的业务逻辑来编写程序(以上代码仅作参考)——
        }
Exemple #16
0
        /// <summary>
        /// 退款
        /// </summary>
        /// <param name="refund"></param>
        /// <returns></returns>
        public OptResult Refound(RefundEntity refund)
        {
            OptResult rst       = null;
            var       operation = CardOperation.Refund;
            var       optDesc   = operation.GetDescription();

            if (refund == null)
            {
                rst = OptResult.Build(ResultCode.ParamError, optDesc + "——参数不能为空!");
                return(rst);
            }
            string msg = string.Empty;

            if (!refund.Check(out msg))
            {
                rst = OptResult.Build(ResultCode.ParamError, string.Format("{0}——{1}!", optDesc, msg));
                return(rst);
            }

            //1、账户是否存在(获取账户信息)
            var card = GetByIdcard(refund.idcard);

            if (card == null)
            {
                rst = OptResult.Build(ResultCode.DataNotFound, string.Format("{0}——指定身份证号{1}的账户不存在!", optDesc, refund.idcard));
                return(rst);
            }
            //2、账户状态
            if (card.State != CardState.Normal)
            {
                rst = OptResult.Build(ResultCode.Fail, string.Format("{0}——一卡通状态异常[{1}]!", optDesc, card.State.GetDescription()));
                return(rst);
            }
            //3、指定订单是否已付款并且未退款(获取付款流水信息)
            PredicateGroup pg = new PredicateGroup {
                Operator = GroupOperator.And, Predicates = new List <IPredicate>()
            };

            pg.Predicates.Add(Predicates.Field <CardBill>(b => b.bill_idcard, Operator.Eq, card.card_idcard));
            pg.Predicates.Add(Predicates.Field <CardBill>(b => b.bill_order, Operator.Eq, refund.order));
            var payTypeWhere = Predicates.Field <CardBill>(b => b.bill_type, Operator.Eq, CardOperation.Pay.ToString());

            pg.Predicates.Add(payTypeWhere);
            var payBill = _cardBillRep.GetList(pg).FirstOrDefault();

            if (payBill == null)
            {
                rst = OptResult.Build(ResultCode.DataNotFound, string.Format("{0}——指定身份证号{1}的订单{2}尚未支付!", optDesc, card.card_idcard, refund.order));
                return(rst);
            }
            pg.Predicates.Remove(payTypeWhere);
            pg.Predicates.Add(Predicates.Field <CardBill>(b => b.bill_type, Operator.Eq, "退款"));
            var count = _cardBillRep.Count(pg);

            if (count > 0)
            {
                rst = OptResult.Build(ResultCode.OptRepeat, string.Format("{0}——指定身份证号{1}的订单{2}已退款!", optDesc, card.card_idcard, refund.order));
                return(rst);
            }
            //4、数据库操作

            /*
             * 退款流程
             * 1)更新一卡通基本信息
             *      gov_new=gov_now+bill.gov_change,my_new=my_now+bill.my_change
             * 2)新增操作记录,type:退款
             * 3)新增流水记录,type:退款
             */
            decimal govchanged = -payBill.bill_changegov; //求反
            decimal mychanged  = -payBill.bill_changemy;  //求反
            decimal govnew     = card.card_govmoney + govchanged;
            decimal mynew      = card.card_mymoney + mychanged;
            var     rec_id     = GuidExtension.GetOne();
            var     optTime    = DateTime.Now;
            var     cardRecord = new CardRecord
            {
                rec_id       = rec_id,
                rec_number   = card.card_number,
                rec_idcard   = card.card_idcard,
                rec_type     = operation.ToString(),
                rec_time     = optTime,
                rec_username = card.card_username,
                rec_remark   = string.Format("退款金额:{0}", govchanged + mychanged),
                rec_operator = refund.opt
            };
            var cardBill = new CardBill
            {
                bill_id        = GuidExtension.GetOne(),
                bill_number    = card.card_number,
                bill_idcard    = card.card_idcard,
                bill_agoall    = card.card_govmoney + card.card_mymoney,
                bill_agogov    = card.card_govmoney,
                bill_agomy     = card.card_mymoney,
                bill_changegov = govchanged,
                bill_changemy  = mychanged,
                bill_nowall    = govnew + mynew,
                bill_nowgov    = govnew,
                bill_nowmy     = mynew,
                bill_type      = operation.ToString(),
                bill_time      = optTime,
                bill_order     = refund.order,
                bill_src       = refund.src,
                bill_record    = rec_id,
                bill_remark    = refund.remark
            };
            //
            var tran = base.Begin();

            try
            {
                //
                count = _cardInfoRep.UpdateBySqlName(SqlName_Update,
                                                     new { card_govmoney = govnew, card_mymoney = mynew, card_modifier = refund.opt, card_modifytime = optTime, card_idcard = refund.idcard },
                                                     new string[] { "card_govmoney", "card_mymoney", "card_modifier", "card_modifytime" },
                                                     tran);
                if (count < 1)
                {
                    tran.Rollback();
                    rst = OptResult.Build(ResultCode.Fail, optDesc + "——未知错误!");
                    return(rst);
                }
                //
                _cardRecordRep.Insert(cardRecord);
                //
                _cardBillRep.Insert(cardBill);

                tran.Commit();
                rst = OptResult.Build(ResultCode.Success, string.Format("{0}——身份证号{1},订单号{2}", optDesc, refund.idcard, refund.order));
            }
            catch (Exception ex)
            {
                LogHelper.LogError(optDesc, ex);
                rst = OptResult.Build(ResultCode.DbError, optDesc);
            }

            return(rst);
        }