public override PayResponseBaseHandler GetRefundResult(MemberTradeForRefund refund) { var requestHandler = new SwiftpassPayRequestHandler(swifpasskey); requestHandler.setParameter("out_trade_no", refund.TradeNo); //商户订单号 requestHandler.setParameter("transaction_id", refund.MechanismTradeNo); //平台订单号 requestHandler.setParameter("service", "unified.trade.refundquery"); //接口 unified.trade.query requestHandler.setParameter("mch_id", payinfo.MchId); //必填项,商户号,由平台分配 requestHandler.setParameter("version", "2.0"); //接口版本号 requestHandler.setParameter("sign_type", "RSA_1_256"); //签名方式 requestHandler.setParameter("nonce_str", Common.CommonUtil.CreateNoncestr(16)); //随机字符串,必填项,不长于 32 位 requestHandler.CreateSign(); //创建签名 //_logger.LogInformation("GetPayResult result 签名成功"); string data = toXml(requestHandler.getAllParameters());//生成XML报文 //_logger.LogInformation("GetPayResult result 生成XML报文:" + data); var result = Post(swifpasskey.ReqUrl, data); //Hashtable param = requestHandler.getAllParameters(); if (result.Status != 0 || result.ResultCode != 0) { throw new Exception($"错误代码2:{result.ErrCode},错误信息2:{result.ErrMsg}"); } return(result); }
public APIResult BeginRefund(RefundArgsModel args) { if (string.IsNullOrEmpty(args.ShopFlag) || string.IsNullOrEmpty(args.TradeNo)) { throw new ArgumentNullException("缺少必须参数"); } var memberrechanges = finaceDb.MemberTradeForRechanges.FirstOrDefault(r => r.TradeNo == args.TradeNo && r.Status == MemberTradeForRechangeStatus.成功); if (memberrechanges == null) { return(Error("未找到支付记录,请检查数据是否正确!")); } var memberrefundobj = finaceDb.memberTradeForRefunds.FirstOrDefault(r => r.TradeNo == args.TradeNo && r.Status == MemberTradeForRefundStatus.成功); if (memberrefundobj != null) { throw new ArgumentNullException($"订单{args.TradeNo}已成功退款,不能重复退款!"); } ShopPayInfo shopPayInfo = shopDb.Query <ShopPayInfo>() .Where(m => !m.IsDel) .Where(m => m.ShopFlag == args.ShopFlag && m.IsEnable) .FirstOrDefault(); if (shopPayInfo == null) { throw new Exception("当前商铺没有设置好退款信息。"); } PayProxyBase payProxy = proxyFactory.GetProxy(shopPayInfo); var Refundno = "TK" + DateTime.Now.Ticks + CommonUtil.CreateNoncestr(5); var model = new MemberTradeForRefund() { AddIP = GetIp(), AddTime = DateTime.Now, AddUser = GetUsername(), MemberId = memberrechanges.MemberId, Detail = "用户退款" + memberrechanges.TotalFee + "分", OutBank = "", PayChannel = payProxy.PayChannel, Status = MemberTradeForRefundStatus.退款中, TimeExpire = DateTime.Now, TimeStart = DateTime.Now, Title = "用户退款", TotalFee = memberrechanges.TotalFee, TradeNo = memberrechanges.TradeNo, MechanismTradeNo = memberrechanges.MechanismTradeNo, RefundTradeNo = Refundno }; finaceDb.AddToMemberTradeForRefund(model); var obj = payProxy.Refund(model); return(Success(obj)); }
public override object Refund(MemberTradeForRefund refund) { var requestHandler = new SwiftpassPayRequestHandler(swifpasskey); requestHandler.setParameter("out_trade_no", refund.TradeNo); //商户订单号 requestHandler.setParameter("total_fee", refund.TotalFee.ToString()); //总金额 requestHandler.setParameter("refund_fee", refund.TotalFee.ToString()); //退款金额 requestHandler.setParameter("out_refund_no", refund.RefundTradeNo); //商户退款单号 requestHandler.setParameter("service", "unified.trade.refund"); //接口类型:pay.weixin.jspay requestHandler.setParameter("mch_id", payinfo.MchId); //必填项,商户号,由平台分配 requestHandler.setParameter("version", "2.0"); //接口版本号 requestHandler.setParameter("nonce_str", Common.CommonUtil.CreateNoncestr(16)); //随机字符串,必填项,不长于 32 位 requestHandler.setParameter("charset", "UTF-8"); //字符集 requestHandler.setParameter("sign_type", "RSA_1_256"); //签名方式 requestHandler.setParameter("op_user_id", payinfo.MchId); //必填项,操作员帐号,默认为商户号 requestHandler.CreateSign(); //创建签名 string data = toXml(requestHandler.getAllParameters()); //生成XML报文 return(Post(swifpasskey.ReqUrl, data)); }
public MemberTradeForRefund RefundAction(RefundArgsModel args) { var orderid = 0; var Refundno = string.Empty; if (string.IsNullOrEmpty(args.TradeNo)) { throw new ArgumentNullException("缺少必须参数"); } var memberrechanges = db.MemberTradeForRechanges.FirstOrDefault(r => r.TradeNo == args.TradeNo && r.Status == MemberTradeForRechangeStatus.成功); if (memberrechanges == null) { throw new ArgumentNullException("未找到支付记录,请检查数据是否正确!"); } orderid = memberrechanges.OrderId; var memberrefundobj = db.memberTradeForRefunds.FirstOrDefault(r => r.TradeNo == args.TradeNo && r.Status == MemberTradeForRefundStatus.成功); if (memberrefundobj != null) { throw new ArgumentNullException($"订单{args.TradeNo}已成功退款,不能重复退款!"); } ShopPayInfo shopPayInfo = shopDb.Query <ShopPayInfo>() .Where(m => !m.IsDel) .Where(m => m.ShopId == memberrechanges.ShopId && (int)m.PayWay == memberrechanges.PayWay) .FirstOrDefault(); if (shopPayInfo == null) { throw new Exception("当前商铺没有设置好退款信息。"); } var payProxy = proxyFactory.GetProxy(shopPayInfo); if (memberrechanges.OrderType == OrderType.普通订单) { Refundno = "TK" + DateTime.Now.Ticks + CommonUtil.CreateNoncestr(5); } else { Refundno = "PTTK" + DateTime.Now.Ticks + CommonUtil.CreateNoncestr(5); } var model = new MemberTradeForRefund() { //AddIP = GetIp(), AddTime = DateTime.Now, //AddUser = GetUsername(), MemberId = memberrechanges.MemberId, Detail = "用户退款" + memberrechanges.TotalFee + "分", OutBank = "", PayChannel = payProxy.PayChannel, Status = MemberTradeForRefundStatus.退款中, TimeExpire = DateTime.Now, TimeStart = DateTime.Now, Title = "用户退款", TotalFee = memberrechanges.TotalFee, TradeNo = memberrechanges.TradeNo, MechanismTradeNo = memberrechanges.MechanismTradeNo, RefundTradeNo = Refundno, OrderType = memberrechanges.OrderType, OrderId = memberrechanges.OrderId }; SwiftpassPayResponseHandler obj = payProxy.Refund(model) as SwiftpassPayResponseHandler; if (obj.Status != 0) { new RefundLog <object>(hchhLog).RefundAction("Refund" , BLL.Log.PayOrRefundType.退款, memberrechanges.OrderId, memberrechanges.OrderType, model, obj, obj.ErrMsg); model.Status = MemberTradeForRefundStatus.失败; db.AddToMemberTradeForRefund(model); db.SaveChanges(); return(model); } if (obj.ResultCode != 0) { model.Detail = obj.ErrCode; #region 添加短信余额不足发短信 if (obj.ErrCode == "BALANCE_NOT_ENOUGH") { var shop = shopDb.Shops.FirstOrDefault(m => m.Flag.Equals(args.ShopFlag)); if (!string.IsNullOrWhiteSpace(shop.Phone)) { model.Detail = "账户余额不足,用户无法申请退款"; SMSHelper.Send(shop.Phone, model.Detail); } } new RefundLog <object>(hchhLog).RefundAction("Refund" , BLL.Log.PayOrRefundType.退款, memberrechanges.OrderId, memberrechanges.OrderType, model, obj, obj.ErrMsg); #endregion model.Status = MemberTradeForRefundStatus.失败; db.AddToMemberTradeForRefund(model); db.SaveChanges(); return(model); } var refundresult = payProxy.GetRefundResult(model) as SwiftpassPayResponseHandler; string returnCode = refundresult.parameters["refund_status_0"].ToString(); if (returnCode == "SUCCESS") { model.Status = MemberTradeForRefundStatus.成功; } else if (returnCode == "FAIL") { model.Status = MemberTradeForRefundStatus.失败; } else if (returnCode == "PROCESSING") { model.Status = MemberTradeForRefundStatus.退款中; } else { model.Detail = returnCode; model.Status = MemberTradeForRefundStatus.失败; } db.AddToMemberTradeForRefund(model); db.SaveChanges(); return(model); }
/// <summary> /// 退款通知 /// </summary> /// <param name="rechange"></param> /// <returns></returns> public abstract PayResponseBaseHandler GetRefundResult(MemberTradeForRefund refund);
/// <summary> /// 退款 /// </summary> /// <param name="sub_openid"></param> /// <returns></returns> public abstract object Refund(MemberTradeForRefund refund);