コード例 #1
0
        public void MakeQR(string provider)
        {
            PayProvider pay = LoadProvider(provider);

            if (pay != null)
            {
                try
                {
                    IPayOrder order = GetPayOrder(pay.Key);
                    if (order == null)
                    {
                        throw new Exception("获取订单信息错误!");
                    }
                    string url = pay.MakeQR(order);
                    if (string.IsNullOrEmpty(url))
                    {
                        throw new Exception(string.Concat("第三方支付\"", provider, "\"暂不支持扫码支付或未实现!"));
                    }
                    OnMakeQR(url, order.TradeNo);
                }
                catch (Exception ex)
                {
                    OnError(ex.Message);
                }
            }
            else
            {
                OnError(string.Concat("第三方支付\"", provider, "\"不被支持或已禁用!"));
            }
        }
コード例 #2
0
        public void Submit(string provider)
        {
            PayProvider pay = LoadProvider(provider);

            if (pay != null)
            {
                if (pay.IsNeedSubmit)
                {
                    try
                    {
                        IPayOrder order = GetPayOrder(pay.Key);
                        if (order == null)
                        {
                            throw new Exception("获取订单信息错误!");
                        }
                        if (pay.IsOnlinePay)
                        {
                            OnSubmit(pay.Submit(this, pay.PackData(order), SubmitText, ReturnUrl));
                        }
                        else
                        {
                            PaymentResult result;
                            bool          value;
                            if (pay.IsCheckMoney)
                            {
                                value = CheckMoney(order, out result);
                            }
                            else
                            {
                                result = new PayResult()
                                {
                                    TradeNo    = order.TradeNo,
                                    PayTradeNo = order.TradeNo,
                                    Status     = "Success",
                                    TotalFee   = order.TotalFee
                                };
                                value = true;
                            }
                            OnCallback(pay, value, result);
                            OnRedirect(this, pay, result, value);
                            //try { Response.Redirect(ReturnUrl, true); }
                            //catch (Exception) { }
                        }
                    }
                    catch (Exception ex)
                    {
                        OnError(ex.Message);
                    }
                }
                else
                {
                    OnError(string.Concat("第三方支付\"", provider, "\"不支持提交!"));
                }
            }
            else
            {
                OnError(string.Concat("第三方支付\"", provider, "\"不被支持或已禁用!"));
            }
        }
コード例 #3
0
 protected override bool OnModifyMoney(PayProvider provider, PaymentType payment, long user, Money money, string trade, string title, int type, string targetId)
 {
     try
     {
         if (payment == PaymentType.Pay)
         {
             return(M.MemberInfo.ModifyMoney(DataSource, user, money, title, type, trade) == DataStatus.Success);
         }
     }
     catch (Exception) { }
     return(false);
 }
コード例 #4
0
        protected PayProvider LoadProvider(string provider)
        {
            PayProvider result = PayProvider.Create(provider);

            if (result != null && CheckProvider(result))
            {
                M.Payment pay = M.Payment.GetById(DataSource, result.Key);
                if (pay != null && pay.Enabled)
                {
                    Uri    uri = Request.Url;
                    string url = string.Concat(uri.Scheme, "://", uri.DnsSafeHost, uri.Port != 80 ? string.Concat(":", uri.Port.ToString()) : string.Empty);
                    result.Partner          = pay.Partner;
                    result.PartnerId        = pay.PartnerId;
                    result.PartnerKey       = pay.PartnerKey;
                    result.PartnerSecret    = pay.PartnerSecret;
                    result.CallbackUrl      = string.Concat(url, GetUrl("/", GetType().Name.ToLower(), "/callback/", provider));
                    result.AsyncCallbackUrl = string.Concat(url, GetUrl("/", GetType().Name.ToLower(), "/notify/", provider));
                    result.Log = GetPayLog();
                    return(result);
                }
            }
            return(null);
        }
コード例 #5
0
        public void Callback(string provider)
        {
            PayProvider pay = LoadProvider(provider);

            if (pay != null)
            {
                PaymentResult result;
                if (pay.Callback(this, out result))
                {
                    OnCallback(pay, true, result);
                    OnRedirect(this, pay, result, true);
                }
                else
                {
                    OnCallback(pay, false, result);
                    OnRedirect(this, pay, result, false);
                }
            }
            else
            {
                OnError(string.Concat("第三方支付\"", provider, "\"不被支持或已禁用!"));
            }
        }
コード例 #6
0
        public void Refund()
        {
            IRefundOrder order = GetRefundOrder();

            if (order != null)
            {
                PayProvider pay = LoadProvider(order.PayProvider);
                if (pay != null)
                {
                    if (pay.IsOnlinePay)
                    {
                        OnSubmit(pay.Refund(this, pay.PackData(order.TradeNo, order), SubmitText));
                    }
                    else
                    {
                        RefundResult result = new RefundResult(new RefundInfo()
                        {
                            PayTradeNo = order.PayTradeNo,
                            TotalFee   = order.TotalFee,
                            Status     = true
                        });
                        OnCallback(pay, true, result);
                        OnRedirect(this, pay, result, true);
                        //try { Response.Redirect(ReturnUrl, true); }
                        //catch (Exception) { }
                    }
                }
                else
                {
                    OnError(string.Concat("第三方支付\"", order.PayProvider, "\"不被支持或已禁用!"));
                }
            }
            else
            {
                OnError(string.Concat("获取订单信息错误!"));
            }
        }
コード例 #7
0
        public void Notify(string provider)
        {
            PayProvider pay = LoadProvider(provider);

            if (pay != null)
            {
                PaymentResult result;
                if (pay.AsyncCallback(this, out result))
                {
                    if (OnNotify(pay, true, result))
                    {
                        pay.AsyncStop(this);
                    }
                }
                else
                {
                    OnNotify(pay, false, result);
                }
            }
            //else
            //{
            //    OnNotifyError(string.Concat("第三方支付\"", provider, "\"不被支持或已禁用!"));
            //}
        }
コード例 #8
0
 protected virtual bool OnNotify(PayProvider provider, bool success, PaymentResult result)
 {
     if (result.Type == PaymentType.Pay)
     {
         PayResult presult = (PayResult)result;
         if (!string.IsNullOrEmpty(presult.TradeNo))
         {
             DataSource.Begin();
             try
             {
                 M.PayRecord pr = M.PayRecord.GetById(DataSource, presult.TradeNo, presult.Type);
                 if (pr == null)
                 {
                     throw new ArgumentException("订单号错误!");
                 }
                 if (pr.Status >= PayStatus.Paying && pr.Status < PayStatus.PaySuccess)
                 {
                     PayStatus status = pr.Status;
                     pr.PayId = presult.PayTradeNo;
                     if (provider.IsOnlinePay)
                     {
                         pr.Money = presult.TotalFee;
                     }
                     if (success)
                     {
                         pr.Status = PayStatus.PaySuccess;
                     }
                     else
                     {
                         pr.Status = PayStatus.PayFailed;
                     }
                     if (pr.UpdateStatus(DataSource, status) == DataStatus.Success)
                     {
                         if (success && pr.Status == PayStatus.PaySuccess)
                         {
                             if (!OnModifyMoney(provider, pr.PayType, pr.UserId, presult.TotalFee, pr.Id, pr.Title, pr.Type, pr.TargetId))
                             {
                                 throw new ArgumentException("充值失败!");
                             }
                         }
                     }
                     else
                     {
                         throw new ArgumentException("更细订单失败!");
                     }
                 }
                 else
                 {
                     if (pr.Status != PayStatus.PaySuccess)
                     {
                         throw new ArgumentException("订单号错误!");
                     }
                 }
                 DataSource.Commit();
                 return(true);
             }
             catch (Exception)
             {
                 DataSource.Rollback();
                 //OnNotifyError(provider, ex.Message);
             }
         }
         //else
         //{
         //    OnNotifyError(provider, "订单号为空!");
         //}
     }
     else
     {
         RefundResult rresult = (RefundResult)result;
         if (!string.IsNullOrEmpty(rresult.BatchNo))
         {
             if (rresult.SuccessNum == 1 && rresult.Results.Count == 1)
             {
                 RefundInfo info = rresult.Results[0];
                 DataSource.Begin();
                 try
                 {
                     M.PayRecord pr = M.PayRecord.GetById(DataSource, rresult.BatchNo, rresult.Type);
                     if (pr == null)
                     {
                         throw new ArgumentException("批次号错误!");
                     }
                     if (pr.PayId != info.PayTradeNo)
                     {
                         throw new ArgumentException("订单号错误!");
                     }
                     if (pr.Status == PayStatus.RefundNotifying)
                     {
                         if (provider.IsOnlinePay)
                         {
                             pr.Money = info.TotalFee;
                         }
                         if (success && info.Status)
                         {
                             pr.Status = PayStatus.RefundSuccess;
                         }
                         else
                         {
                             pr.Status = PayStatus.RefundFailed;
                         }
                         if (pr.UpdateStatus(DataSource, PayStatus.RefundNotifying) == DataStatus.Success)
                         {
                             if (success && info.Status && pr.Status == PayStatus.RefundSuccess)
                             {
                                 if (!OnModifyMoney(provider, pr.PayType, pr.UserId, info.TotalFee, pr.Id, pr.Title, pr.Type, pr.TargetId))
                                 {
                                     throw new ArgumentException("退款失败!");
                                 }
                             }
                         }
                         else
                         {
                             throw new ArgumentException("更新订单失败!");
                         }
                     }
                     else
                     {
                         if (pr.Status != PayStatus.RefundSuccess)
                         {
                             throw new ArgumentException("批次号错误!");
                         }
                     }
                     DataSource.Commit();
                     return(true);
                 }
                 catch (Exception)
                 {
                     DataSource.Rollback();
                     //OnNotifyError(provider, ex.Message);
                 }
             }
             //else
             //{
             //    OnNotifyError(provider, "退款数量错误!");
             //}
         }
         //else
         //{
         //    OnNotifyError(provider, "批次号为空!");
         //}
     }
     return(false);
 }
コード例 #9
0
 protected abstract bool OnModifyMoney(PayProvider provider, PaymentType payment, long user, Money money, string trade, string title, int type, string targetId);
コード例 #10
0
 protected virtual bool CheckProvider(PayProvider provider)
 {
     return(true);
 }
コード例 #11
0
        protected virtual void OnCallback(PayProvider provider, bool success, PaymentResult result)
        {
            #region Pay
            if (result.Type == PaymentType.Pay)
            {
                PayResult presult = (PayResult)result;
                if (!string.IsNullOrEmpty(presult.TradeNo))
                {
                    DataSource.Begin();
                    try
                    {
                        M.PayRecord pr = M.PayRecord.GetById(DataSource, presult.TradeNo, result.Type);
                        if (pr == null)
                        {
                            throw new ArgumentException("订单号错误!");
                        }
                        if (pr.Status >= PayStatus.Paying && pr.Status < PayStatus.PaySuccess)
                        {
                            PayStatus status = pr.Status;
                            pr.PayId = presult.PayTradeNo;
                            if (provider.IsOnlinePay)
                            {
                                pr.Money = presult.TotalFee;
                            }
                            if (success)
                            {
                                if (provider.IsNeedNotify)
                                {
                                    pr.Status = PayStatus.PayNotifying;
                                }
                                else
                                {
                                    pr.Status = PayStatus.PaySuccess;
                                }
                            }
                            else
                            {
                                if (provider.IsOnlinePay && !provider.IsNeedNotify)
                                {
                                    pr.Status = PayStatus.PayFailed;
                                }
                                else
                                {
                                    if (!provider.IsOnlinePay)
                                    {
                                        throw new Exception("余额不足!");
                                    }
                                }
                            }
                            if (pr.UpdateStatus(DataSource, status) == DataStatus.Success)
                            {
                                if (success && pr.Status == PayStatus.PaySuccess)
                                {
                                    if (!OnModifyMoney(provider, pr.PayType, pr.UserId, presult.TotalFee, pr.Id, pr.Title, pr.Type, pr.TargetId))
                                    {
                                        throw new ArgumentException("充值失败!");
                                    }
                                }
                            }
                            else
                            {
                                throw new ArgumentException("更新订单失败!");
                            }
                        }
                        DataSource.Commit();
                    }
                    catch (Exception ex)
                    {
                        DataSource.Rollback();
                        OnError(ex.Message);
                    }
                }
                else
                {
                    OnError("订单号为空!");
                }
            }
            #endregion

            #region Refund
            else if (result.Type == PaymentType.Refund)
            {
                //RefundResult presult = (RefundResult)result;
                //if (!string.IsNullOrEmpty(presult.BatchNo))
                //{
                //    DataSource.Begin();
                //    try
                //    {
                //        M.PayRecord pr = M.PayRecord.GetById(DataSource, presult.BatchNo, result.Type);
                //        if (pr == null)
                //            throw new ArgumentException("订单号错误!");
                //        if (pr.Status == PayStatus.RefundNotifying)
                //        {
                //            PayStatus status = pr.Status;
                //            if (provider.IsOnlinePay)
                //                pr.Money = presult.TotalFee;
                //            if (success)
                //            {
                //                if (provider.IsNeedNotify)
                //                    pr.Status = PayStatus.PayNotifying;
                //                else
                //                    pr.Status = PayStatus.PaySuccess;
                //            }
                //            else
                //            {
                //                if (provider.IsOnlinePay && !provider.IsNeedNotify)
                //                {
                //                    pr.Status = PayStatus.PayFailed;
                //                }
                //                else
                //                {
                //                    if (!provider.IsOnlinePay)
                //                        throw new Exception("余额不足!");
                //                }
                //            }
                //            if (pr.UpdateStatus(DataSource, status) == DataStatus.Success)
                //            {
                //                if (success && pr.Status == PayStatus.PaySuccess)
                //                {
                //                    if (!OnModifyMoney(provider, pr.PayType, pr.UserId, presult.TotalFee, pr.Id, pr.Title, pr.Type, pr.TargetId))
                //                        throw new ArgumentException("充值失败!");
                //                }
                //            }
                //            else
                //            {
                //                throw new ArgumentException("更新订单失败!");
                //            }
                //        }
                //        DataSource.Commit();
                //    }
                //    catch (Exception ex)
                //    {
                //        DataSource.Rollback();
                //        OnError(ex.Message);
                //    }
                //}
                //else
                //{
                //    OnError("订单号为空!");
                //}
            }
            #endregion

            else
            {
                throw new ArgumentException("支付类型错误!");
            }
        }
コード例 #12
0
 public virtual void OnRedirect(Controller context, PayProvider pay, PaymentResult result, bool payType)
 {
     try { context.Response.Redirect(ReturnUrl, true); }
     catch (Exception) { }
 }
コード例 #13
0
 protected override bool CheckProvider(PayProvider provider)
 {
     return(provider.IsOnlinePay);
 }