Beispiel #1
0
        private static RefundResult getRefundResult(RefundRequestProcess.RefundInfo refundInfo)
        {
            var result = new RefundResult
            {
                Success    = refundInfo.RefundStatus == B3B.Common.Enums.RefundStatus.RefundSuccess,
                Account    = refundInfo.Account,
                RefundTime = refundInfo.RefundTime,
            };

            if (!result.Success)
            {
                result.ErrorMessage = refundInfo.RefundRemark;
            }

            var billRoles = new List <Distribution.Domain.Role.TradeRoleType>();

            if (string.IsNullOrWhiteSpace(refundInfo.RefundRemark))
            {
                billRoles.Add(Distribution.Domain.Role.TradeRoleType.Purchaser);
            }
            else
            {
                var roleType      = typeof(Distribution.Domain.Role.TradeRoleType);
                var billRoleTexts = refundInfo.RefundRemark.Split(',');
                foreach (var tradeRole in billRoleTexts)
                {
                    billRoles.Add((Distribution.Domain.Role.TradeRoleType)Enum.Parse(roleType, tradeRole, true));
                }
            }
            result.Roles = billRoles;
            return(result);
        }
Beispiel #2
0
        private static RefundResult getRefundResult(RefundInfo refundInfo, bool isRoyaltyBill)
        {
            var result = new RefundResult {
                Success    = refundInfo.Status == RefundStatus.RefundSuccess,
                Account    = isRoyaltyBill ? refundInfo.RefundAccount.AccountNo : refundInfo.IncomeAccount.AccountNo,
                RefundTime = refundInfo.RefundDate,
            };

            if (!result.Success)
            {
                result.ErrorMessage = refundInfo.Description;
            }

            var billRoles = new List <Distribution.Domain.Role.TradeRoleType>();

            if (string.IsNullOrWhiteSpace(refundInfo.ExtendParameter))
            {
                billRoles.Add(Distribution.Domain.Role.TradeRoleType.Purchaser);
            }
            else
            {
                var roleType      = typeof(Distribution.Domain.Role.TradeRoleType);
                var billRoleTexts = refundInfo.ExtendParameter.Split(',');
                foreach (var tradeRole in billRoleTexts)
                {
                    billRoles.Add((Distribution.Domain.Role.TradeRoleType)Enum.Parse(roleType, tradeRole, true));
                }
            }
            result.Roles = billRoles;
            return(result);
        }
Beispiel #3
0
 private static string getRefundResponse(RefundResult refundInfo)
 {
     if (refundInfo == null)
     {
         return(string.Empty);
     }
     return(string.Format("退款账号:{0} 退款状态:{1} 退款时间:{2:yyyy-MM-dd}",
                          refundInfo.Account,
                          refundInfo.Success?"成功":"失败",
                          refundInfo.RefundTime));
 }
Beispiel #4
0
        /// <summary>
        /// 改期退款
        /// </summary>
        /// <param name="orderId">原订单号</param>
        /// <param name="refundBill">退款账单</param>
        internal static RefundResult Refund(decimal orderId, Distribution.Domain.Bill.Refund.PostponeRefundBill refundBill)
        {
            // 构建退款请求信息
            var tradeRefundView = new TradeRefundDTO()
            {
                TradeNo         = refundBill.Tradement.Payment.TradeNo,
                RefundBatchNo   = refundBill.Tradement.TradeNo,
                TradeRefundType = RefundType.TradeRefund,
                RefundAmount    = refundBill.Applier.Amount,
                RefundReason    = RefundBusinessType.DenyPostpone.GetDescription()
            };

            // 调用退款接口
#if (DEBUG)
            var refundBatch = ChinaPay.PoolPay.Service.AccountTradeService.TradeRefund(tradeRefundView);
            var result      = new RefundResult()
            {
                Success    = refundBatch.TradeRefund.Status == RefundStatus.RefundSuccess,
                Account    = refundBatch.TradeRefund.IncomeAccount.AccountNo,
                RefundTime = refundBatch.TradeRefund.RefundDate
            };
#else
            RefundRequestProcess refundRequestProcess = new RefundRequestProcess(refundBill.Tradement.Payment.TradeNo,
                                                                                 refundBill.Tradement.TradeNo, RefundBusinessType.DenyPostpone.GetDescription(),
                                                                                 refundBill.Applier.Amount.ToString());

            RefundResult result = new RefundResult();
            if (refundRequestProcess.Execute())
            {
                var refundInfo = RefundRequestProcess.ParseRefundInfo(refundRequestProcess.outPayer);
                result = new RefundResult()
                {
                    Success    = refundInfo.RefundStatus == Common.Enums.RefundStatus.RefundSuccess,
                    Account    = refundInfo.Account,
                    RefundTime = refundInfo.RefundTime
                };
            }
#endif
            // 记录交互日志
            var refundRequest = string.Format("支付交易流水号:{0} 退款批次号:{1} 退款类型:{2} 退款金额:{3} 退款原因:{4}",
                                              tradeRefundView.TradeNo, tradeRefundView.RefundBatchNo,
                                              tradeRefundView.TradeRefundType, tradeRefundView.RefundAmount,
                                              tradeRefundView.RefundReason);
            Service.LogService.SaveTradementLog(new TradementLog {
                OrderId     = orderId,
                ApplyformId = refundBill.ApplyformId,
                Type        = TradementBusinessType.Refund,
                Request     = refundRequest,
                Response    = getRefundResponse(result),
                Time        = DateTime.Now,
                Remark      = RefundBusinessType.DenyPostpone.GetDescription()
            });
            // 如果退款失败,记录退款失败信息
            var repository = Order.Repository.Factory.CreateRefundRepository();
            if (result.Success)
            {
                repository.Delete(refundBill.ApplyformId);
            }
            else
            {
                repository.Save(new RefundFailedRecord()
                {
                    OrderId          = orderId,
                    ApplyformId      = refundBill.ApplyformId,
                    BusinessType     = RefundBusinessType.DenyPostpone,
                    PayTradeNo       = tradeRefundView.TradeNo,
                    RefundFailedInfo = getRefundResponse(result),
                    RefundTime       = DateTime.Now
                });
            }
            return(result);
        }
Beispiel #5
0
        /// <summary>
        /// 交易退款
        /// </summary>
        /// <param name="refundBill">退款账单</param>
        /// <param name="refundBusinessType">退款类型</param>
        internal static RefundResult TradeRefund(Distribution.Domain.Bill.Refund.NormalRefundBill refundBill, RefundBusinessType refundBusinessType)
        {
            // 构建退款请求信息
            var tradeRefundView = new TradeRefundDTO()
            {
                TradeNo         = refundBill.Tradement.Payment.TradeNo,
                RefundBatchNo   = refundBill.Tradement.TradeNo,
                TradeRefundType = RefundType.TradeRefund,
                RefundAmount    = refundBill.Purchaser.Amount,
                RefundReason    = refundBusinessType.GetDescription()
            };
            RefundResult result        = null;
            var          failedMessage = string.Empty;

            //RefundBatch refundBatch = null;
            try {
                // 调用退款接口
                //refundBatch = PoolPay.Service.AccountTradeService.TradeRefund(tradeRefundView);
                //result = getRefundResult(refundBatch.TradeRefund, false);
                var refundRequestProcess = new RefundRequestProcess(tradeRefundView.TradeNo, tradeRefundView.RefundBatchNo, tradeRefundView.RefundReason, refundBill.Purchaser.Amount.ToString());
                if (refundRequestProcess.Execute())
                {
                    result = getRefundResult(RefundRequestProcess.ParseRefundInfo(refundRequestProcess.outPayer));
                }
                else
                {
                    failedMessage = refundRequestProcess.Message;
                }
            } catch (Exception ex) {
                LogService.SaveExceptionLog(ex, "提交交易退款");
                failedMessage = ex.Message;
            }
            // 记录交互日志
            var refundRequest = string.Format("支付交易流水号:{0} 退款批次号:{1} 退款类型:{2} 退款金额:{3} 退款原因{4}",
                                              tradeRefundView.TradeNo, tradeRefundView.RefundBatchNo,
                                              tradeRefundView.TradeRefundType, tradeRefundView.RefundAmount,
                                              tradeRefundView.RefundReason);

            Service.LogService.SaveTradementLog(new TradementLog {
                OrderId     = refundBill.OrderId,
                ApplyformId = refundBill.ApplyformId,
                Type        = TradementBusinessType.Refund,
                Request     = refundRequest,
                Response    = result == null ? failedMessage : getRefundResponse(result),
                Time        = DateTime.Now,
                Remark      = refundBusinessType.GetDescription()
            });
            // 如果退款失败,记录退款失败信息
            var repository = Order.Repository.Factory.CreateRefundRepository();

            if (result != null && result.Success)
            {
                repository.Delete(refundBill.ApplyformId);
            }
            else
            {
                repository.Save(new RefundFailedRecord()
                {
                    OrderId          = refundBill.OrderId,
                    ApplyformId      = refundBill.ApplyformId,
                    BusinessType     = refundBusinessType,
                    PayTradeNo       = tradeRefundView.TradeNo,
                    RefundFailedInfo = failedMessage,
                    RefundTime       = DateTime.Now
                });
            }
            return(result);
        }