コード例 #1
0
        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);
        }
コード例 #2
0
        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));
        }
コード例 #3
0
        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));
        }
コード例 #4
0
        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);
        }
コード例 #5
0
 /// <summary>
 /// 退款通知
 /// </summary>
 /// <param name="rechange"></param>
 /// <returns></returns>
 public abstract PayResponseBaseHandler GetRefundResult(MemberTradeForRefund refund);
コード例 #6
0
 /// <summary>
 /// 退款
 /// </summary>
 /// <param name="sub_openid"></param>
 /// <returns></returns>
 public abstract object Refund(MemberTradeForRefund refund);