Ejemplo n.º 1
0
        /// <summary>
        /// 退款请求执行成功
        /// </summary>
        /// <param name="requestInfo">退款请求记录</param>
        public virtual void ExecuteSuccess(RefundRequestInfo requestInfo)
        {
            //更新退款请求记录的执行结果
            requestInfo.ExecuteResult = (int)ResultStatus.Success;
            requestInfo.Status        = (int)AppEnum.GlobalStatus.Valid;
            RefundRequestDAL.Update(requestInfo);

            //作废重复的退款请求记录
            RefundRequestDAL.InvalidateRepeatRequest(requestInfo);
        }
Ejemplo n.º 2
0
        /// <summary>
        /// 插入退款请求记录
        /// </summary>
        /// <param name="info"></param>
        /// <returns></returns>
        public static int Insert(RefundRequestInfo info)
        {
            string sql = @"
INSERT  INTO Refund_Request
        (OrderId,TradeNo,RefundOrderId,RefundAmt,NotifyUrl,PayType,RequestData,ExecuteResult,ResultDesc,AppId,Status,CreateTime)
VALUES  (@OrderId,@TradeNo,@RefundOrderId,@RefundAmt,@NotifyUrl,@PayType,@RequestData,@ExecuteResult,@ResultDesc,@AppId,@Status,@CreateTime);
SELECT  SCOPE_IDENTITY();";

            info.SysNo = DbHelper.QueryScalar <int>(sql, info);
            return(info.SysNo);
        }
Ejemplo n.º 3
0
        /// <summary>
        /// 保存退款请求
        /// </summary>
        /// <param name="appId">业务系统ID</param>
        /// <param name="data">业务数据报文</param>
        /// <param name="payType">支付方式</param>
        /// <returns></returns>
        public virtual RefundRequestInfo SaveRequest(string appId, string data, AppEnum.PayType payType)
        {
            var requestInfo = new RefundRequestInfo()
            {
                PayType       = (int)payType,
                RequestData   = data,
                ExecuteResult = (int)ResultStatus.None,
                AppId         = appId,
                Status        = (int)AppEnum.GlobalStatus.Valid,
                CreateTime    = DateTime.Now,
            };

            requestInfo.SysNo = RefundRequestDAL.Insert(requestInfo);
            return(requestInfo);
        }
Ejemplo n.º 4
0
        /// <summary>
        /// 更新退款请求记录(不更新PayType、RequestData、AppId字段)
        /// </summary>
        /// <param name="info"></param>
        /// <returns></returns>
        public static bool Update(RefundRequestInfo info)
        {
            if (info == null || info.SysNo <= 0)
            {
                return(false);
            }

            string sql   = @"
UPDATE  Refund_Request
SET     OrderId=@OrderId,
        TradeNo=@TradeNo,
        RefundOrderId=@RefundOrderId,
        RefundAmt=@RefundAmt,
        NotifyUrl=@NotifyUrl,
        ExecuteResult=@ExecuteResult,
        ResultDesc=@ResultDesc,
        Status=@Status
WHERE   SysNo=@SysNo";
            int    count = DbHelper.Execute(sql, info);

            return(count > 0);
        }
Ejemplo n.º 5
0
        /// <summary>
        /// 解析退款请求
        /// </summary>
        /// <param name="data">业务数据报文</param>
        /// <param name="requestInfo">退款请求记录</param>
        /// <returns></returns>
        public virtual ExecuteResult ResolveRequest(string data, RefundRequestInfo requestInfo)
        {
            var result = new ExecuteResult();
            var info   = JsonHelper.Deserialize <RefundOrderInfo>(data);

            if (info != null)
            {
                requestInfo.OrderId       = info.OrderId;
                requestInfo.TradeNo       = info.TradeNo;
                requestInfo.RefundOrderId = info.RefundOrderId;
                decimal refundAmt = 0;
                decimal.TryParse(info.RefundAmt, out refundAmt);
                requestInfo.RefundAmt = refundAmt;
                requestInfo.NotifyUrl = info.NotifyUrl;
                RefundRequestDAL.Update(requestInfo);
                result.Status = ResultStatus.Success;
            }
            else
            {
                result.Status  = ResultStatus.Failure;
                result.Message = "解析退款请求参数失败";
            }
            return(result);
        }
Ejemplo n.º 6
0
        /// <summary>
        /// 作废重复的退款请求记录
        /// </summary>
        /// <returns></returns>
        public static bool InvalidateRepeatRequest(RefundRequestInfo info)
        {
            string sql   = @"
UPDATE  Refund_Request
SET     Status=@status
WHERE   OrderId=@orderId
        AND RefundOrderId=@refundOrderId
        AND PayType=@payType
        AND SysNo<@sysNo
        AND NOT EXISTS ( SELECT 1
                         FROM   Refund_Result
                         WHERE  RequestSysNo=Refund_Request.SysNo )";
            var    param = new
            {
                status        = (int)AppEnum.GlobalStatus.Invalid,
                orderId       = info.OrderId,
                refundOrderId = info.RefundOrderId,
                payType       = (int)info.PayType,
                sysNo         = info.SysNo
            };
            int count = DbHelper.Execute(sql, param);

            return(count > 0);
        }
Ejemplo n.º 7
0
        /// <summary>
        /// 校验退款参数
        /// </summary>
        /// <param name="data">业务数据报文</param>
        /// <param name="payType">支付方式</param>
        /// <param name="requestInfo">退款请求记录</param>
        /// <returns></returns>
        public virtual ExecuteResult <RefundOrderInfo> CheckParamaters(string data, AppEnum.PayType payType, RefundRequestInfo requestInfo)
        {
            var result = this.CheckParamaters(data, payType);

            if (result.Status != ResultStatus.Success)
            {
                requestInfo.ExecuteResult = (int)ResultStatus.Failure;
                requestInfo.ResultDesc    = result.Message;
                RefundRequestDAL.Update(requestInfo);
            }
            return(result);
        }
Ejemplo n.º 8
0
        /// <summary>
        /// 校验数据签名
        /// </summary>
        /// <param name="appId">业务系统ID</param>
        /// <param name="sign">数据签名</param>
        /// <param name="data">业务数据报文</param>
        /// <param name="requestInfo">退款请求记录</param>
        /// <returns></returns>
        public virtual ExecuteResult CheckSign(string appId, string sign, string data, RefundRequestInfo requestInfo)
        {
            var result = SignManager.CheckSign(appId, sign, data);

            if (result.Status != ResultStatus.Success || !result.Data)
            {
                requestInfo.ExecuteResult = (int)ResultStatus.Failure;
                requestInfo.ResultDesc    = string.IsNullOrWhiteSpace(result.Message) ? "签名校验未通过" : result.Message;
                RefundRequestDAL.Update(requestInfo);
                result.Status = ResultStatus.Failure;
            }
            return(result);
        }
Ejemplo n.º 9
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);
        }