/// <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); }
/// <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); }
/// <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); }
/// <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); }
/// <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); }
/// <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); }
/// <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); }
/// <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); }
/// <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); }