Example #1
0
        /// <summary>
        /// 更新退款结果记录并关联退款请求记录
        /// </summary>
        /// <param name="resultInfo">退款结果记录</param>
        /// <returns></returns>
        public virtual ExecuteResult <RefundRequestInfo> RelateRequestInfo(RefundResultInfo resultInfo)
        {
            var result = new ExecuteResult <RefundRequestInfo>();

            //判断是否存在有效的退款结果记录,如果存在,则当前退款结果记录不执行
            bool exist = RefundResultDAL.ExistValidRefundResult(resultInfo);

            if (exist)
            {
                resultInfo.ExecuteResult = (int)ResultStatus.Failure;
                resultInfo.ResultDesc    = "已存在有效的退款结果记录";
                RefundResultDAL.Update(resultInfo);

                result.Status  = ResultStatus.Failure;
                result.Message = resultInfo.ResultDesc;
                return(result);
            }

            var requestInfo = RefundRequestDAL.GetValidRefundRequest(resultInfo.OrderId, resultInfo.RefundOrderId, (AppEnum.PayType)resultInfo.PayType);

            if (requestInfo != null && requestInfo.SysNo > 0)
            {
                resultInfo.RequestSysNo = requestInfo.SysNo;
            }

            RefundResultDAL.Update(resultInfo);
            result.Status = ResultStatus.Success;
            result.Data   = requestInfo;
            return(result);
        }
Example #2
0
        /// <summary>
        /// 插入退款结果回执记录
        /// </summary>
        /// <param name="info"></param>
        /// <returns></returns>
        public static int Insert(RefundResultInfo info)
        {
            string sql = @"
INSERT  INTO Refund_Result
        (RequestSysNo,OrderId,RefundOrderId,RefundAmt,RefundNo,PayType,RequestData,ExecuteResult,ResultDesc,NotifyStatus,CreateTime)
VALUES  (@RequestSysNo,@OrderId,@RefundOrderId,@RefundAmt,@RefundNo,@PayType,@RequestData,@ExecuteResult,@ResultDesc,@NotifyStatus,@CreateTime);
SELECT  SCOPE_IDENTITY();";

            info.SysNo = DbHelper.QueryScalar <int>(sql, info);
            return(info.SysNo);
        }
Example #3
0
        /// <summary>
        /// 保存退款结果请求
        /// </summary>
        /// <param name="data">业务数据报文</param>
        /// <param name="payType">支付方式</param>
        /// <returns></returns>
        public RefundResultInfo SaveRequest(string data, AppEnum.PayType payType)
        {
            var resultInfo = new RefundResultInfo()
            {
                PayType       = (int)payType,
                RequestData   = data,
                ExecuteResult = (int)ResultStatus.None,
                NotifyStatus  = (int)AppEnum.NotifyStatus.Original,
                CreateTime    = DateTime.Now,
            };

            resultInfo.SysNo = RefundResultDAL.Insert(resultInfo);
            return(resultInfo);
        }
Example #4
0
        /// <summary>
        /// 获取退款结果通知对象
        /// </summary>
        /// <param name="resultInfo">退款结果记录</param>
        /// <param name="tradeNo">支付交易流水号</param>
        /// <returns></returns>
        protected RefundNotifyInfo GetRefundNotifyInfo(RefundResultInfo resultInfo, string tradeNo)
        {
            var notifyInfo = new RefundNotifyInfo()
            {
                OrderId       = resultInfo.OrderId,
                TradeNo       = tradeNo,
                RefundOrderId = resultInfo.RefundOrderId,
                RefundNo      = resultInfo.RefundNo,
                RefundAmt     = resultInfo.RefundAmt.ToString(),
                Result        = resultInfo.ExecuteResult.ToString(),
            };

            return(notifyInfo);
        }
Example #5
0
        /// <summary>
        /// 是否存在有效的退款结果记录
        /// </summary>
        /// <param name="orderId"></param>
        /// <param name="refundOrderId"></param>
        /// <param name="refundNo"></param>
        /// <param name="payType"></param>
        /// <returns></returns>
        public static bool ExistValidRefundResult(RefundResultInfo info)
        {
            string sql   = @"
SELECT  COUNT(1)
FROM    Refund_Result
WHERE   OrderId=@orderId
        AND RefundOrderId=@refundOrderId
        AND RefundNo=@refundNo
        AND PayType=@payType
        AND ExecuteResult=@result;";
            int    count = DbHelper.QueryScalar <int>(sql, new
            {
                orderId       = info.OrderId,
                refundOrderId = info.RefundOrderId,
                refundNo      = info.RefundNo,
                payType       = info.PayType,
                result        = (int)ResultStatus.Success
            });

            return(count > 0);
        }
Example #6
0
        /// <summary>
        /// 更新退款结果回执记录(不更新PayType、RequestData字段)
        /// </summary>
        /// <param name="info"></param>
        /// <returns></returns>
        public static bool Update(RefundResultInfo info)
        {
            if (info.SysNo <= 0)
            {
                return(false);
            }

            string sql   = @"
UPDATE  Refund_Result
SET     RequestSysNo=@RequestSysNo,
        OrderId=@OrderId,
        RefundOrderId=@RefundOrderId,
        RefundAmt=@RefundAmt,
        RefundNo=@RefundNo,
        ExecuteResult=@ExecuteResult,
        ResultDesc=@ResultDesc,
        NotifyStatus=@NotifyStatus
WHERE   SysNo=@SysNo";
            int    count = DbHelper.Execute(sql, info);

            return(count > 0);
        }
Example #7
0
 /// <summary>
 /// 执行同步退款
 /// </summary>
 /// <param name="orderInfo">退款订单</param>
 /// <param name="resultInfo">退款结果记录</param>
 /// <returns></returns>
 public abstract ExecuteResult <RefundNotifyInfo> ExecuteSyncRefund(RefundOrderInfo orderInfo, RefundResultInfo resultInfo);
Example #8
0
 /// <summary>
 /// 解析异步退款结果
 /// </summary>
 /// <param name="data">业务数据报文</param>
 /// <param name="resultInfo">退款结果记录</param>
 /// <returns></returns>
 public abstract ExecuteResult <RefundNotifyInfo> ResolveRequest(string data, RefundResultInfo resultInfo);
Example #9
0
 /// <summary>
 /// 校验异步退款结果请求
 /// </summary>
 /// <param name="data">业务数据报文</param>
 /// <param name="resultInfo">退款结果记录</param>
 /// <returns></returns>
 public abstract ExecuteResult CheckRequest(string data, RefundResultInfo resultInfo);
Example #10
0
        /// <summary>
        /// 执行同步退款
        /// </summary>
        /// <param name="orderInfo">退款订单</param>
        /// <param name="resultInfo">退款结果记录</param>
        /// <returns></returns>
        public override ExecuteResult <RefundNotifyInfo> ExecuteSyncRefund(RefundOrderInfo orderInfo, RefundResultInfo resultInfo)
        {
            var result = new ExecuteResult <RefundNotifyInfo>();

            try
            {
                resultInfo.OrderId       = orderInfo.OrderId;
                resultInfo.RefundOrderId = orderInfo.RefundOrderId;
                resultInfo.RefundAmt     = Convert.ToDecimal(orderInfo.RefundAmt);
                //获取退款金额
                int refundAmt  = (int)(resultInfo.RefundAmt * 100);//通联退款金额的单位为“分”,所以要乘以100
                var refundData = new AllinpayData(AllinpayDataType.RefundRequest);
                //商户号
                refundData.SetValue("merchantId", AppConfig.Global.AllinpayMerchantId);
                //商户订单号
                refundData.SetValue("orderNo", orderInfo.OrderId);
                //退款金额
                refundData.SetValue("refundAmount", refundAmt.ToString());
                //商户订单提交时间
                refundData.SetValue("orderDatetime", orderInfo.OrderTime);
                //签名字符串
                refundData.SetValue("signMsg", AllinpayCore.RefundSign(refundData));

                var executeResult = AllinpayManager.RefundRequest(refundData);
                if (executeResult.Status != ResultStatus.Success)
                {
                    resultInfo.ExecuteResult = (int)ResultStatus.Failure;
                    resultInfo.ResultDesc    = "通联退款请求失败:" + executeResult.Message;
                    RefundResultDAL.Update(resultInfo);

                    result.Status  = ResultStatus.Error;
                    result.Message = resultInfo.ResultDesc;
                    return(result);
                }

                //退款成功,解析返回参数
                resultInfo.RefundNo      = "";
                resultInfo.ExecuteResult = (int)ResultStatus.Success;

                result.Data   = this.GetRefundNotifyInfo(resultInfo, orderInfo.TradeNo);
                result.Status = ResultStatus.Success;
            }
            catch (Exception ex)
            {
                resultInfo.ExecuteResult = (int)ResultStatus.Error;
                resultInfo.ResultDesc    = ex.Message;
                RefundResultDAL.Update(resultInfo);

                result.Status  = ResultStatus.Error;
                result.Message = ex.Message;
            }
            return(result);
        }
Example #11
0
 /// <summary>
 /// 解析异步退款结果
 /// </summary>
 /// <param name="data">业务数据报文</param>
 /// <param name="resultInfo">退款结果记录</param>
 /// <returns></returns>
 public override ExecuteResult <RefundNotifyInfo> ResolveRequest(string data, RefundResultInfo resultInfo)
 {
     return(new ExecuteResult <RefundNotifyInfo>());
 }
Example #12
0
 /// <summary>
 /// 校验异步退款结果请求
 /// </summary>
 /// <param name="data">业务数据报文</param>
 /// <param name="resultInfo">退款结果记录</param>
 /// <returns></returns>
 public override ExecuteResult CheckRequest(string data, RefundResultInfo resultInfo)
 {
     return(new ExecuteResult());
 }
Example #13
0
        /// <summary>
        /// 执行同步退款
        /// </summary>
        /// <param name="orderInfo">退款订单</param>
        /// <param name="resultInfo">退款结果记录</param>
        /// <returns></returns>
        public override ExecuteResult <RefundNotifyInfo> ExecuteSyncRefund(RefundOrderInfo orderInfo, RefundResultInfo resultInfo)
        {
            var result = new ExecuteResult <RefundNotifyInfo>();

            try
            {
                resultInfo.OrderId       = orderInfo.OrderId;
                resultInfo.RefundOrderId = orderInfo.RefundOrderId;
                resultInfo.RefundAmt     = Convert.ToDecimal(orderInfo.RefundAmt);
                int paymentAmt = (int)(Convert.ToDecimal(orderInfo.PaymentAmt) * 100); //微信支付金额的单位为“分”,所以要乘以100
                int refundAmt  = (int)(resultInfo.RefundAmt * 100);                    //微信退款金额的单位为“分”,所以要乘以100

                //提交退款请求
                WxPayData wxData = PayRefund.Run(orderInfo.TradeNo, orderInfo.OrderId, paymentAmt, refundAmt, orderInfo.RefundOrderId);

                //校验返回参数
                if (wxData.GetValue("return_code").ToString() != "SUCCESS")
                {
                    resultInfo.ExecuteResult = (int)ResultStatus.Failure;
                    resultInfo.ResultDesc    = "微信退款请求失败:" + wxData.GetValue("return_msg").ToString();
                    RefundResultDAL.Update(resultInfo);

                    result.Status  = ResultStatus.Failure;
                    result.Message = resultInfo.ResultDesc;
                    return(result);
                }
                else if (wxData.GetValue("result_code").ToString() != "SUCCESS")
                {
                    resultInfo.ExecuteResult = (int)ResultStatus.Failure;
                    resultInfo.ResultDesc    = "微信退款执行失败:" + wxData.GetValue("err_code_des").ToString();
                    RefundResultDAL.Update(resultInfo);

                    result.Status  = ResultStatus.Failure;
                    result.Message = resultInfo.ResultDesc;
                    return(result);
                }

                //退款成功,解析返回参数
                resultInfo.RefundNo      = wxData.GetValue("refund_id").ToString();
                resultInfo.ExecuteResult = (int)ResultStatus.Success;

                result.Data   = this.GetRefundNotifyInfo(resultInfo, orderInfo.TradeNo);
                result.Status = ResultStatus.Success;
            }
            catch (WxPayException wex)
            {
                resultInfo.ExecuteResult = (int)ResultStatus.Error;
                resultInfo.ResultDesc    = wex.Message;
                RefundResultDAL.Update(resultInfo);

                result.Status  = ResultStatus.Error;
                result.Message = wex.Message;
            }
            catch (Exception ex)
            {
                resultInfo.ExecuteResult = (int)ResultStatus.Error;
                resultInfo.ResultDesc    = ex.ToString();
                RefundResultDAL.Update(resultInfo);

                result.Status  = ResultStatus.Error;
                result.Message = ex.Message;
            }
            return(result);
        }
Example #14
0
        /// <summary>
        /// 执行同步退款
        /// </summary>
        /// <param name="orderInfo">退款订单</param>
        /// <param name="resultInfo">退款结果记录</param>
        /// <returns></returns>
        public override ExecuteResult <RefundNotifyInfo> ExecuteSyncRefund(RefundOrderInfo orderInfo, RefundResultInfo resultInfo)
        {
            var result = new ExecuteResult <RefundNotifyInfo>();

            resultInfo.OrderId       = orderInfo.OrderId;
            resultInfo.RefundOrderId = orderInfo.RefundOrderId;
            resultInfo.RefundAmt     = Convert.ToDecimal(orderInfo.RefundAmt);
            resultInfo.RefundNo      = DateTime.Now.ToString("yyyyMMddHHmmssfff") + RandomHelper.CreateRandomCode(3);
            resultInfo.ExecuteResult = (int)ResultStatus.Success;

            result.Data   = this.GetRefundNotifyInfo(resultInfo, orderInfo.TradeNo);
            result.Status = ResultStatus.Success;
            return(result);
        }
Example #15
0
        /// <summary>
        /// 通知业务系统退款结果
        /// </summary>
        /// <param name="resultInfo">退款结果记录</param>
        /// <param name="requestInfo">退款请求记录</param>
        /// <returns></returns>
        public virtual ExecuteResult NotifyBack(RefundResultInfo resultInfo, RefundRequestInfo requestInfo)
        {
            var result = new ExecuteResult()
            {
                Status = ResultStatus.Failure
            };

            //退款结果记录对象无效,则不执行
            if (resultInfo == null || resultInfo.SysNo <= 0)
            {
                result.Message = "退款结果记录对象无效";
                return(result);
            }

            //退款请求记录对象无效,则不执行
            if (requestInfo == null || requestInfo.SysNo <= 0)
            {
                result.Message = "退款请求记录对象无效";
                return(result);
            }

            //退款结果记录与退款请求记录不对应,则不执行
            if (requestInfo.SysNo != resultInfo.RequestSysNo)
            {
                result.Message = "退款结果记录与退款请求记录不对应";
                return(result);
            }

            //退款结果记录未成功执行,或者已通知,则不执行
            if (resultInfo.ExecuteResult != (int)ResultStatus.Success || resultInfo.NotifyStatus == (int)AppEnum.NotifyStatus.Finished)
            {
                result.Message = "退款结果记录未成功执行或已通知";
                return(result);
            }

            //退款请求记录中不存在有效的通知地址,则不执行
            if (!requestInfo.NotifyUrl.IsUrl())
            {
                result.Message = "退款请求记录中不存在有效的通知地址";
                return(result);
            }

            var    notifyInfo = this.GetRefundNotifyInfo(resultInfo, requestInfo.TradeNo);
            string data       = JsonHelper.Serialize(notifyInfo);
            string sign       = SignManager.CreateSign(requestInfo.AppId, data).Data;
            string param      = string.Format("appId={0}&sign={1}&data={2}", requestInfo.AppId, sign, data);
            var    response   = HttpHelper.HttpRequest("POST", requestInfo.NotifyUrl, param, 10000);
            string status     = JsonHelper.GetJsonNode(response, "status");
            string msg        = JsonHelper.GetJsonNode(response, "msg");

            result.Message = msg;

            var backInfo = new NotifyBackInfo()
            {
                ResultSysNo  = resultInfo.SysNo,
                Status       = (int)AppEnum.GlobalStatus.Invalid,
                Msg          = msg,
                CreateTime   = DateTime.Now,
                ResponseData = response,
            };

            if (status == "1")
            {
                backInfo.Status         = (int)AppEnum.GlobalStatus.Valid;
                resultInfo.NotifyStatus = (int)AppEnum.NotifyStatus.Finished;
                RefundResultDAL.Update(resultInfo);
                result.Status = ResultStatus.Success;
            }
            RefundResultDAL.InsertNotifyBack(backInfo);
            return(result);
        }