コード例 #1
0
        /// <summary>
        /// 校验浏览器是否是某种类型
        /// </summary>
        /// <param name="browserType">浏览器类型</param>
        /// <param name="requestInfo">支付请求记录</param>
        /// <returns></returns>
        public virtual ExecuteResult CheckBrowserType(AppEnum.BrowserType browserType, PayRequestInfo requestInfo)
        {
            var result = new ExecuteResult();

            if (browserType == AppEnum.BrowserType.WeChat && !RequestHelper.IsWeChatRequest())
            {
                result.Status             = ResultStatus.Failure;
                requestInfo.ExecuteResult = (int)ResultStatus.Failure;
                result.Message            = requestInfo.ResultDesc = "非微信环境中不能使用微信支付,请更换其他支付方式";
                PayRequestDAL.Update(requestInfo);
                return(result);
            }

            if (browserType == AppEnum.BrowserType.Others && RequestHelper.IsWeChatRequest())
            {
                result.Status             = ResultStatus.Failure;
                requestInfo.ExecuteResult = (int)ResultStatus.Failure;
                result.Message            = requestInfo.ResultDesc = "微信中只能使用微信支付,请更换支付方式";
                PayRequestDAL.Update(requestInfo);
                return(result);
            }

            result.Status = ResultStatus.Success;
            return(result);
        }
コード例 #2
0
ファイル: PayResult.cs プロジェクト: iampkm/ebs.pay
        /// <summary>
        /// 更新支付结果记录并关联支付请求记录
        /// </summary>
        /// <param name="resultInfo">支付结果记录</param>
        /// <returns></returns>
        public virtual PayRequestInfo RelateRequestInfo(PayResultInfo resultInfo)
        {
            //判断是否存在有效的支付结果记录,如果存在,则当前支付结果记录不执行
            bool exist = PayResultDAL.ExistValidPayResult(resultInfo.OrderId, resultInfo.TradeNo, (AppEnum.PayType)resultInfo.PayType);

            if (exist)
            {
                resultInfo.ExecuteResult = (int)ResultStatus.Failure;
                resultInfo.ResultDesc    = "已存在有效的支付结果记录";
            }

            PayRequestInfo requestInfo = null;

            if (resultInfo.ExecuteResult == (int)ResultStatus.Success)
            {
                requestInfo = PayRequestDAL.GetValidPayRequest(resultInfo.OrderId, (AppEnum.PayType)resultInfo.PayType);
                if (requestInfo != null && requestInfo.SysNo > 0)
                {
                    resultInfo.RequestSysNo = requestInfo.SysNo;
                }
            }

            //更新支付结果记录信息
            PayResultDAL.Update(resultInfo);

            return(requestInfo);
        }
コード例 #3
0
        /// <summary>
        /// 支付请求执行成功
        /// </summary>
        /// <param name="requestInfo">支付请求记录</param>
        public virtual void ExecuteSuccess(PayRequestInfo requestInfo)
        {
            //更新支付请求记录的执行结果
            requestInfo.ExecuteResult = (int)ResultStatus.Success;
            requestInfo.Status        = (int)AppEnum.GlobalStatus.Valid;
            PayRequestDAL.Update(requestInfo);

            //作废重复的支付请求记录
            PayRequestDAL.InvalidateRepeatRequest(requestInfo);
        }
コード例 #4
0
        /// <summary>
        /// 校验支付参数
        /// </summary>
        /// <param name="data">业务数据报文</param>
        /// <param name="payType">支付方式</param>
        /// <param name="requestInfo">支付请求记录</param>
        /// <returns></returns>
        public override ExecuteResult <PayOrderInfo> CheckParamaters(string data, AppEnum.PayType payType, PayRequestInfo requestInfo)
        {
            var result = this.CheckParamaters(data, payType);

            if (result.Status != ResultStatus.Success)
            {
                requestInfo.ExecuteResult = (int)ResultStatus.Failure;
                requestInfo.ResultDesc    = result.Message;
                PayRequestDAL.Update(requestInfo);
            }
            return(result);
        }
コード例 #5
0
        public JsonResult Notify(int resultSysNo)
        {
            try
            {
                var resultInfo = PayResultDAL.GetPayResult(resultSysNo);
                if (resultInfo == null || resultInfo.SysNo <= 0)
                {
                    return(Json(new { status = 0, msg = "支付结果记录不存在" }));
                }

                if (resultInfo.ExecuteResult != (int)ResultStatus.Success)
                {
                    return(Json(new { status = 0, msg = "支付结果记录不是成功且有效的支付" }));
                }

                if (resultInfo.RequestSysNo <= 0)
                {
                    return(Json(new { status = 0, msg = "支付结果记录无对应的请求记录" }));
                }

                var requestInfo = PayRequestDAL.GetPayRequest(resultInfo.RequestSysNo);
                if (requestInfo == null || requestInfo.SysNo <= 0)
                {
                    return(Json(new { status = 0, msg = "支付结果记录对应的请求记录不存在" }));
                }

                if (!requestInfo.NotifyUrl.IsUrl())
                {
                    return(Json(new { status = 0, msg = "支付请求记录的通知地址无效" }));
                }

                var resultInterface = Builder.BuildAlipayResult();
                var notifyResult    = resultInterface.NotifyBack(resultInfo, requestInfo);
                if (notifyResult.Status == ResultStatus.Success)
                {
                    return(Json(new { status = 1, msg = "通知成功" }));
                }

                //如果已经通知多次,则将通知状态改成已作废
                int notifyCount = PayResultDAL.GetNotifyBackCount(resultInfo.SysNo);
                if (notifyCount >= 5 && resultInfo.NotifyStatus != (int)AppEnum.NotifyStatus.Canceled)
                {
                    resultInfo.NotifyStatus = (int)AppEnum.NotifyStatus.Canceled;
                    PayResultDAL.Update(resultInfo);
                }
                return(Json(new { status = 0, msg = "通知失败,原因:" + notifyResult.Message }));
            }
            catch (Exception ex)
            {
                LogWriter.WriteLog(ex.Message + "\r\n" + ex.StackTrace, _logDirName, ExceptionHelper.ExceptionLevel.Exception);
                return(Json(new { status = -1, msg = ex.Message, error = ex.StackTrace }));
            }
        }
コード例 #6
0
        public JsonResult CheckPay(string orderId, string resultType)
        {
            try
            {
                if (!Request.IsAjaxRequest())
                {
                    return(Json(new { status = -2, msg = "非法请求!" }));
                }

                var requestInfo = PayRequestDAL.GetValidPayRequest(orderId, this._payType);
                if (requestInfo == null || requestInfo.SysNo <= 0)
                {
                    return(Json(new { status = -2, msg = "系统不存在该订单的支付请求,请自行返回下单页面!" }));
                }

                var notifyInfo = new PayNotifyInfo()
                {
                    OrderId    = requestInfo.OrderId,
                    PaymentAmt = requestInfo.PaymentAmt.ToString(),
                    TradeNo    = "",
                    ExtTradeNo = "",
                    Result     = ((int)ResultStatus.Failure).ToString(),
                };

                int status     = 0;
                var resultInfo = PayResultDAL.GetValidPayResult(orderId, this._payType);
                if (resultInfo != null && resultInfo.SysNo > 0)
                {
                    status                = 1;//有支付成功记录
                    notifyInfo.TradeNo    = resultInfo.TradeNo;
                    notifyInfo.ExtTradeNo = resultInfo.ExtTradeNo;
                    notifyInfo.Result     = resultInfo.ExecuteResult.ToString();
                }

                //当支付页面收到的支付结果为成功时,不管有没有收到支付成功的异步回执,返回到支付结果着陆页时都提示支付成功
                if (string.Equals(resultType, "ok", StringComparison.CurrentCultureIgnoreCase))
                {
                    notifyInfo.Result = ((int)ResultStatus.Success).ToString();
                }

                var resultInterface = Builder.BuildWeChatPayResult();
                var url             = resultInterface.GetReturnUrl(requestInfo, notifyInfo);
                return(Json(new { status = status, url = url }));
            }
            catch (Exception ex)
            {
                string log = string.Format(@"校验支付结果发生异常!{0}异常描述:{1}{0}异常堆栈:{2}{0}请求参数:orderId={3}",
                                           Environment.NewLine, ex.Message, ex.StackTrace, orderId);
                LogWriter.WriteLog(log, AppConfig.Global.SwiftPassWeChatPayLogFolder, ExceptionHelper.ExceptionLevel.Exception);
                return(Json(new { status = -1, msg = "系统执行时发生异常!", error = ex.Message }));
            }
        }
コード例 #7
0
        /// <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, PayRequestInfo 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;
                PayRequestDAL.Update(requestInfo);
                result.Status = ResultStatus.Failure;
            }
            return(result);
        }
コード例 #8
0
        /// <summary>
        /// 保存支付请求记录
        /// </summary>
        /// <param name="data"></param>
        /// <param name="payType"></param>
        /// <returns></returns>
        public static PayRequestInfo SavePayRequest(string data, AppEnum.PayType payType)
        {
            var payRequest = new PayRequestInfo()
            {
                PayType       = (int)payType,
                RequestData   = data,
                ExecuteResult = (int)ResultStatus.None,
                Status        = (int)AppEnum.GlobalStatus.Invalid,
                CreateTime    = DateTime.Now,
            };

            payRequest.SysNo = PayRequestDAL.Insert(payRequest);
            return(payRequest);
        }
コード例 #9
0
        /// <summary>
        /// 保存支付请求
        /// </summary>
        /// <param name="appId">业务系统ID</param>
        /// <param name="data">业务数据报文</param>
        /// <param name="payType">支付方式</param>
        /// <returns></returns>
        public virtual PayRequestInfo SaveRequest(string appId, string data, AppEnum.PayType payType)
        {
            var requestInfo = new PayRequestInfo()
            {
                PayType       = (int)payType,
                RequestData   = data,
                ExecuteResult = (int)ResultStatus.None,
                AppId         = appId,
                Status        = (int)AppEnum.GlobalStatus.Invalid,
                CreateTime    = DateTime.Now,
            };

            requestInfo.SysNo = PayRequestDAL.Insert(requestInfo);
            return(requestInfo);
        }
コード例 #10
0
        /// <summary>
        /// 支付完成返回页面
        /// </summary>
        /// <returns></returns>
        public ActionResult OnlinePayReturn()
        {
            //请求参数报文
            string requestParams = string.Empty;
            //支付完成通知对象
            var notifyInfo = new PayNotifyInfo();

            try
            {
                var resultInterface = Builder.BuildAllinpayResult();
                requestParams = HttpUtility.UrlDecode(Request.Form.ToString());
                var resultInfo = new PayResultInfo();

                //校验请求报文
                var checkResult = resultInterface.CheckRequest(requestParams, resultInfo);
                if (checkResult.Status != ResultStatus.Success)
                {
                    ViewBag.ErrorMsg = checkResult.Message;
                    return(View());
                }

                //解析支付结果
                var resolveResult = resultInterface.ResolveRequest(requestParams, resultInfo);
                if (resolveResult.Status != ResultStatus.Success)
                {
                    ViewBag.ErrorMsg = resolveResult.Message;
                    return(View());
                }

                //获取支付完成返回地址,如果有值,则跳转到该地址去
                notifyInfo = resolveResult.Data;
                var requestInfo = PayRequestDAL.GetValidPayRequest(notifyInfo.OrderId, this._payType);
                var returnUrl   = resultInterface.GetReturnUrl(requestInfo, notifyInfo);
                if (!string.IsNullOrEmpty(returnUrl))
                {
                    return(Redirect(returnUrl));
                }
            }
            catch (Exception ex)
            {
                string log = string.Format(@"支付完成返回发生异常!{0}异常描述:{1}{0}异常堆栈:{2}{0}请求参数:{3}",
                                           Environment.NewLine, ex.Message, ex.StackTrace, requestParams);
                LogWriter.WriteLog(log, AppConfig.Global.AllinpayLogFolder, ExceptionHelper.ExceptionLevel.Exception);
                ViewBag.ErrorMsg = "系统执行发生异常:" + ex.Message;
            }
            ViewBag.NotifyInfo = notifyInfo;
            return(View());
        }
コード例 #11
0
        public JsonResult GetReturnUrl(int resultSysNo)
        {
            try
            {
                var resultInfo = PayResultDAL.GetPayResult(resultSysNo);
                if (resultInfo == null || resultInfo.SysNo <= 0)
                {
                    return(Json(new { status = 0, msg = "支付结果记录不存在" }));
                }

                if (resultInfo.RequestSysNo <= 0)
                {
                    return(Json(new { status = 0, msg = "支付结果记录无对应的请求记录" }));
                }

                var requestInfo = PayRequestDAL.GetPayRequest(resultInfo.RequestSysNo);
                if (requestInfo == null || requestInfo.SysNo <= 0)
                {
                    return(Json(new { status = 0, msg = "支付结果记录对应的请求记录不存在" }));
                }

                if (!requestInfo.ReturnUrl.IsUrl())
                {
                    return(Json(new { status = 0, msg = "支付请求记录的返回地址不是有效URL" }));
                }

                var notifyInfo = new PayNotifyInfo()
                {
                    OrderId    = resultInfo.OrderId,
                    PaymentAmt = resultInfo.PaymentAmt.ToString(),
                    TradeNo    = resultInfo.TradeNo,
                    ExtTradeNo = resultInfo.ExtTradeNo,
                    Result     = resultInfo.ExecuteResult.ToString(),
                };

                var    resultInterface = Builder.BuildAlipayResult();
                string returnUrl       = resultInterface.GetReturnUrl(requestInfo, notifyInfo);
                return(Json(new { status = 1, href = returnUrl }));
            }
            catch (Exception ex)
            {
                LogWriter.WriteLog(ex.Message + "\r\n" + ex.StackTrace, _logDirName, ExceptionHelper.ExceptionLevel.Exception);
                return(Json(new { status = -1, msg = ex.Message, error = ex.StackTrace }));
            }
        }
コード例 #12
0
ファイル: TestController.cs プロジェクト: iampkm/ebs.pay
        public ActionResult AllinpayRefund(string appId, string appSecret, string orderId)
        {
            if (appSecret != AppCache.GetAppSecret(appId))
            {
                return(Json(new { msg = "非法appSecret" }));
            }

            var resultInfo = PayResultDAL.GetValidPayResult(orderId, AppEnum.PayType.Allinpay);

            if (resultInfo == null || resultInfo.SysNo <= 0)
            {
                return(Json(new { msg = "订单无支付记录" }));
            }

            var             requestInfo = PayRequestDAL.GetPayRequest(resultInfo.RequestSysNo);
            var             orderTime   = JsonHelper.Deserialize <PayOrderInfo>(requestInfo.RequestData).OrderTime;
            RefundOrderInfo info        = new RefundOrderInfo()
            {
                OrderId       = orderId,
                OrderTime     = orderTime ?? DateTime.Now.ToString("yyyyMMddHHmmss"),
                TradeNo       = resultInfo.TradeNo,
                PaymentAmt    = resultInfo.PaymentAmt.ToString(),
                RefundOrderId = DateTime.Now.ToString("yyyyMMddHHmmssfff"),
                RefundAmt     = resultInfo.PaymentAmt.ToString(),
                NotifyUrl     = string.Format("http://{0}/Test/RefundNotify?type=0", AppConfig.Global.Domain),
            };
            var setting = JsonHelper.GetDefaultSettings();

            setting.NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore;
            string data = JsonHelper.Serialize(info, setting);
            string sign = SignManager.CreateSign(appId, data).Data;

            ViewBag.AppId = appId;
            ViewBag.Sign  = sign;
            ViewBag.Data  = data;
            ViewBag.Title = "通联支付退款(测试)";
            ViewBag.Url   = "/allinpay/syncrefund";
            return(View("Pay"));
        }
コード例 #13
0
        /// <summary>
        /// 解析支付请求
        /// </summary>
        /// <param name="data">业务数据报文</param>
        /// <param name="requestInfo">支付请求记录</param>
        /// <returns></returns>
        public virtual ExecuteResult ResolveRequest(string data, PayRequestInfo requestInfo)
        {
            var result = new ExecuteResult();
            var info   = JsonHelper.Deserialize <PayOrderInfo>(data);

            if (info != null)
            {
                requestInfo.OrderId = info.OrderId;
                decimal paymentAmt = 0;
                decimal.TryParse(info.PaymentAmt, out paymentAmt);
                requestInfo.PaymentAmt = paymentAmt;
                requestInfo.NotifyUrl  = info.NotifyUrl;
                requestInfo.ReturnUrl  = info.ReturnUrl;
                PayRequestDAL.Update(requestInfo);
                result.Status = ResultStatus.Success;
            }
            else
            {
                result.Status  = ResultStatus.Failure;
                result.Message = "解析支付请求参数失败";
            }
            return(result);
        }
コード例 #14
0
        /// <summary>
        /// 校验在线支付参数
        /// </summary>
        /// <param name="data"></param>
        /// <returns></returns>
        public static ExecuteResult <PayOrderInfo> ValidateOnlinePayParams(string data, AppEnum.PayType payType)
        {
            //校验结果
            var result = new ExecuteResult <PayOrderInfo>();
            //参数名称
            string paramName = null;
            //金额匹配表达式(最多保留2位小数正实数)
            string amtReg = @"^\d+(\.[0-9]{1,2}0*)?$";

            #region 校验支付报文结构
            var info = JsonHelper.Deserialize <PayOrderInfo>(data);
            if (info == null)
            {
                result.Status  = ResultStatus.Failure;
                result.Message = "参数data格式不正确";
                return(result);
            }
            #endregion

            #region 校验参数类型和值

            #region 校验订单编号
            paramName = "orderId";
            if (string.IsNullOrWhiteSpace(info.OrderId))
            {
                result.Status  = ResultStatus.Failure;
                result.Message = string.Format("参数{0}不能为空", paramName);
                return(result);
            }
            #endregion

            #region 校验支付金额
            paramName = "paymentAmt";
            if (string.IsNullOrWhiteSpace(info.PaymentAmt))
            {
                result.Status  = ResultStatus.Failure;
                result.Message = string.Format("参数{0}不能为空", paramName);
                return(result);
            }
            decimal paymentAmt = 0;
            if (!Regex.IsMatch(info.PaymentAmt, amtReg) || !decimal.TryParse(info.PaymentAmt, out paymentAmt))
            {
                result.Status  = ResultStatus.Failure;
                result.Message = string.Format("参数{0}类型错误", paramName);
                return(result);
            }
            if (paymentAmt <= 0)
            {
                result.Status  = ResultStatus.Failure;
                result.Message = string.Format("参数{0}必须大于0", paramName);
                return(result);
            }
            #endregion

            #region 校验下单时间
            paramName = "orderTime";
            if (string.IsNullOrWhiteSpace(info.OrderTime))
            {
                result.Status  = ResultStatus.Failure;
                result.Message = string.Format("参数{0}不能为空", paramName);
                return(result);
            }
            DateTime orderTime;
            if (!DateTime.TryParseExact(info.OrderTime, "yyyyMMddHHmmss", new CultureInfo("zh-CN", true), DateTimeStyles.None, out orderTime))
            {
                result.Status  = ResultStatus.Failure;
                result.Message = string.Format("参数{0}格式错误", paramName);
                return(result);
            }
            #endregion

            #region 校验支付完成的通知地址
            paramName = "notifyUrl";
            if (string.IsNullOrWhiteSpace(info.NotifyUrl))
            {
                result.Status  = ResultStatus.Failure;
                result.Message = string.Format("参数{0}不能为空", paramName);
                return(result);
            }
            if (!info.NotifyUrl.IsUrl())
            {
                result.Status  = ResultStatus.Failure;
                result.Message = string.Format("参数{0}格式错误", paramName);
                return(result);
            }
            #endregion

            #region 校验支付完成的返回地址
            paramName = "returnUrl";
            if (string.IsNullOrWhiteSpace(info.ReturnUrl))
            {
                result.Status  = ResultStatus.Failure;
                result.Message = string.Format("参数{0}不能为空", paramName);
                return(result);
            }
            if (!info.ReturnUrl.IsUrl())
            {
                result.Status  = ResultStatus.Failure;
                result.Message = string.Format("参数{0}格式错误", paramName);
                return(result);
            }
            #endregion

            #region 校验跨境支付订单
            if (info.CrossboardType == "1")
            {
                #region 校验货款金额
                paramName = "goodsPrice";
                if (string.IsNullOrWhiteSpace(info.GoodsPrice))
                {
                    result.Status  = ResultStatus.Failure;
                    result.Message = string.Format("参数{0}不能为空", paramName);
                    return(result);
                }
                decimal goodsPrice = 0;
                if (!Regex.IsMatch(info.GoodsPrice, amtReg) || !decimal.TryParse(info.GoodsPrice, out goodsPrice))
                {
                    result.Status  = ResultStatus.Failure;
                    result.Message = string.Format("参数{0}类型错误", paramName);
                    return(result);
                }
                if (goodsPrice <= 0)
                {
                    result.Status  = ResultStatus.Failure;
                    result.Message = string.Format("参数{0}必须大于0", paramName);
                    return(result);
                }
                #endregion

                #region 校验税费金额
                paramName = "taxPrice";
                if (string.IsNullOrWhiteSpace(info.TaxPrice))
                {
                    result.Status  = ResultStatus.Failure;
                    result.Message = string.Format("参数{0}不能为空", paramName);
                    return(result);
                }
                decimal taxPrice = 0;
                if (!Regex.IsMatch(info.TaxPrice, amtReg) || !decimal.TryParse(info.TaxPrice, out taxPrice))
                {
                    result.Status  = ResultStatus.Failure;
                    result.Message = string.Format("参数{0}类型错误", paramName);
                    return(result);
                }
                if (taxPrice < 0)
                {
                    result.Status  = ResultStatus.Failure;
                    result.Message = string.Format("参数{0}必须大于等于0", paramName);
                    return(result);
                }
                #endregion

                #region 校验运费金额
                paramName = "freightPrice";
                if (string.IsNullOrWhiteSpace(info.FreightPrice))
                {
                    result.Status  = ResultStatus.Failure;
                    result.Message = string.Format("参数{0}不能为空", paramName);
                    return(result);
                }
                decimal freightPrice = 0;
                if (!Regex.IsMatch(info.FreightPrice, amtReg) || !decimal.TryParse(info.FreightPrice, out freightPrice))
                {
                    result.Status  = ResultStatus.Failure;
                    result.Message = string.Format("参数{0}类型错误", paramName);
                    return(result);
                }
                if (freightPrice < 0)
                {
                    result.Status  = ResultStatus.Failure;
                    result.Message = string.Format("参数{0}必须大于等于0", paramName);
                    return(result);
                }
                #endregion

                #region 校验货款、税费、运费与支付金额的关系
                if (paymentAmt != goodsPrice + taxPrice + freightPrice)
                {
                    result.Status  = ResultStatus.Failure;
                    result.Message = "关系“paymentAmt = goodsPrice + taxPrice + freightPrice”不成立";
                    return(result);
                }
                #endregion

                #region 校验购买人姓名
                paramName = "buyerName";
                if (string.IsNullOrWhiteSpace(info.BuyerName))
                {
                    result.Status  = ResultStatus.Failure;
                    result.Message = string.Format("参数{0}不能为空", paramName);
                    return(result);
                }
                #endregion

                #region 校验购买人手机号码
                paramName = "buyerCellphone";
                if (string.IsNullOrWhiteSpace(info.BuyerCellphone))
                {
                    result.Status  = ResultStatus.Failure;
                    result.Message = string.Format("参数{0}不能为空", paramName);
                    return(result);
                }
                #endregion

                #region 校验购买人身份证号
                paramName = "buyerIdCardNo";
                if (string.IsNullOrWhiteSpace(info.BuyerIdCardNo))
                {
                    result.Status  = ResultStatus.Failure;
                    result.Message = string.Format("参数{0}不能为空", paramName);
                    return(result);
                }
                #endregion
            }
            #endregion

            #region 校验业务系统编号
            paramName = "systemId";
            if (!string.IsNullOrWhiteSpace(info.SystemId))
            {
                int systemId = 0;
                if (!int.TryParse(info.SystemId, out systemId))
                {
                    result.Status  = ResultStatus.Failure;
                    result.Message = string.Format("参数{0}类型错误", paramName);
                    return(result);
                }
                if (systemId <= 0)
                {
                    result.Status  = ResultStatus.Failure;
                    result.Message = string.Format("参数{0}必须大于0", paramName);
                    return(result);
                }
            }
            #endregion

            #endregion

            #region 校验是否已支付
            if (PayRequestDAL.ExistValidPayResult(info.OrderId, payType))
            {
                result.Status  = ResultStatus.Failure;
                result.Message = "该订单已成功支付,不能重复支付";
                return(result);
            }
            #endregion

            result.Status = ResultStatus.Success;
            result.Data   = info;
            return(result);
        }
コード例 #15
0
        /// <summary>
        /// 校验条形码支付参数
        /// </summary>
        /// <param name="data"></param>
        /// <returns></returns>
        public static ExecuteResult <PayOrderInfo> ValidateBarcodePayParams(string data, AppEnum.PayType payType)
        {
            //校验结果
            var result = new ExecuteResult <PayOrderInfo>();
            //参数名称
            string paramName = null;
            //金额匹配表达式(最多保留2位小数正实数)
            string amtReg = @"^\d+(\.[0-9]{1,2}0*)?$";

            #region 校验支付报文结构
            var info = JsonHelper.Deserialize <PayOrderInfo>(data);
            if (info == null)
            {
                result.Status  = ResultStatus.Failure;
                result.Message = "参数data格式不正确";
                return(result);
            }
            #endregion

            #region 校验参数类型和值

            #region 校验订单编号
            paramName = "orderId";
            if (string.IsNullOrWhiteSpace(info.OrderId))
            {
                result.Status  = ResultStatus.Failure;
                result.Message = string.Format("参数{0}不能为空", paramName);
                return(result);
            }
            #endregion

            #region 校验支付金额
            paramName = "paymentAmt";
            if (string.IsNullOrWhiteSpace(info.PaymentAmt))
            {
                result.Status  = ResultStatus.Failure;
                result.Message = string.Format("参数{0}不能为空", paramName);
                return(result);
            }
            decimal paymentAmt = 0;
            if (!Regex.IsMatch(info.PaymentAmt, amtReg) || !decimal.TryParse(info.PaymentAmt, out paymentAmt))
            {
                result.Status  = ResultStatus.Failure;
                result.Message = string.Format("参数{0}类型错误", paramName);
                return(result);
            }
            if (paymentAmt <= 0)
            {
                result.Status  = ResultStatus.Failure;
                result.Message = string.Format("参数{0}必须大于0", paramName);
                return(result);
            }
            #endregion

            #region 校验支付条形码
            paramName = "barcode";
            if (string.IsNullOrWhiteSpace(info.Barcode))
            {
                result.Status  = ResultStatus.Failure;
                result.Message = string.Format("参数{0}不能为空", paramName);
                return(result);
            }
            #endregion

            #region 校验业务系统编号
            paramName = "systemId";
            if (!string.IsNullOrWhiteSpace(info.SystemId))
            {
                int systemId = 0;
                if (!int.TryParse(info.SystemId, out systemId))
                {
                    result.Status  = ResultStatus.Failure;
                    result.Message = string.Format("参数{0}类型错误", paramName);
                    return(result);
                }
                if (systemId <= 0)
                {
                    result.Status  = ResultStatus.Failure;
                    result.Message = string.Format("参数{0}必须大于0", paramName);
                    return(result);
                }
            }
            #endregion

            #endregion

            #region 校验是否已支付
            if (PayRequestDAL.ExistValidPayResult(info.OrderId, payType))
            {
                result.Status  = ResultStatus.Failure;
                result.Message = "该订单已成功支付,不能重复支付";
                return(result);
            }
            #endregion

            result.Status = ResultStatus.Success;
            result.Data   = info;
            return(result);
        }
コード例 #16
0
        /// <summary>
        /// PC在线支付
        /// </summary>
        /// <param name="appId">业务系统ID</param>
        /// <param name="sign">签名</param>
        /// <param name="data">数据报文</param>
        public ActionResult OnlinePay(string appId, string sign, string data)
        {
            try
            {
                var onlinePay = Builder.BuildOnlinePay();

                //校验支付模式
                if (onlinePay.CheckModeIsSimulate())
                {
                    return(RedirectToActionPermanent("OnlinePay", "Simulate", new { payType = (int)this._payType, appId = appId, sign = sign, data = data }));
                }

                //移动端访问,跳转至微信Wap支付
                if (RequestHelper.IsWapRequest())
                {
                    return(RedirectToAction("OnlineWapPay", new { appId = appId, sign = sign, data = data }));
                }

                //保存请求报文
                var requestInfo = onlinePay.SaveRequest(appId, data, this._payType);

                //校验签名
                var checkResult = onlinePay.CheckSign(appId, sign, data, requestInfo);
                if (checkResult.Status != ResultStatus.Success)
                {
                    ViewBag.ErrorMsg = checkResult.Message;
                    return(View());
                }

                //解析支付请求
                checkResult = onlinePay.ResolveRequest(data, requestInfo);
                if (checkResult.Status != ResultStatus.Success)
                {
                    ViewBag.ErrorMsg = checkResult.Message;
                    return(View());
                }

                //校验支付参数
                var checkResult2 = onlinePay.CheckParamaters(data, this._payType, requestInfo);
                if (checkResult2.Status != ResultStatus.Success)
                {
                    ViewBag.ErrorMsg = checkResult2.Message;
                    return(View());
                }
                PayOrderInfo orderInfo = checkResult2.Data;

                #region 生成支付二维码链接code_url
                try
                {
                    //获取订单支付金额
                    int paymentAmt = (int)(requestInfo.PaymentAmt * 100);//微信支付金额的单位为“分”,所以要乘以100
                    //异步通知url
                    string notifyUrl = string.Format("http://{0}/SwiftPassWeChatPay/OnlinePayNotify", AppConfig.Global.Domain);

                    DateTime orderEndTime  = DateTime.ParseExact(orderInfo.OrderTime, "yyyyMMddHHmmss", new CultureInfo("zh-CN", true)).AddHours(24);
                    DateTime minExpireTime = DateTime.Now.AddMinutes(6);//为保险,多加1分钟
                    //交易过期时间(最短过期时间间隔必须大于5分钟)
                    string expireTime = (orderEndTime > minExpireTime ? orderEndTime : minExpireTime).ToString("yyyyMMddHHmmss");
                    //向微信发起统一下单请求
                    string codeUrl = SwiftPassPayApi.WeChatNativePay(requestInfo.OrderId, paymentAmt, notifyUrl, expireTime);

                    ViewBag.CodeUrl     = codeUrl;
                    ViewBag.RequestInfo = requestInfo;
                }
                catch (BizException bex)
                {
                    requestInfo.ResultDesc    = bex.Message;
                    requestInfo.ExecuteResult = (int)ResultStatus.Error;
                    PayRequestDAL.Update(requestInfo);

                    ViewBag.ErrorMsg = bex.Message;
                    return(View());
                }
                catch (Exception ex)
                {
                    requestInfo.ExecuteResult = (int)ResultStatus.Error;
                    requestInfo.ResultDesc    = ex.ToString();
                    PayRequestDAL.Update(requestInfo);

                    ViewBag.ErrorMsg = "系统执行时发生异常:" + ex.Message;
                    return(View());
                }
                #endregion

                //支付请求执行成功
                onlinePay.ExecuteSuccess(requestInfo);
            }
            catch (Exception ex)
            {
                ViewBag.ErrorMsg = "系统执行时发生异常:" + ex.Message;
                string log = string.Format(@"PC支付请求发生异常!{0}异常描述:{1}{0}异常堆栈:{2}{0}请求参数:appId={3} sign={4} data={5}",
                                           Environment.NewLine, ex.Message, ex.StackTrace, appId, sign, data);
                LogWriter.WriteLog(log, AppConfig.Global.SwiftPassWeChatPayLogFolder, ExceptionHelper.ExceptionLevel.Exception);
            }
            return(View());
        }
コード例 #17
0
        /// <summary>
        /// WAP在线支付JSPAI页面
        /// </summary>
        /// <param name="requestSysNo"></param>
        /// <param name="code"></param>
        /// <returns></returns>
        public ActionResult OnlineWapPayJSAPI(int requestSysNo, string code)
        {
            try
            {
                var onlinePay = Builder.BuildOnlinePay();

                //获取支付请求记录
                var requestInfo = PayRequestDAL.GetPayRequest(requestSysNo);
                if (requestInfo == null || requestInfo.SysNo <= 0)
                {
                    ViewBag.ErrorMsg = "您尚未发起支付请求,请返回后重新提交";
                    return(View());
                }

                //校验支付环境
                var checkResult = onlinePay.CheckBrowserType(AppEnum.BrowserType.WeChat, requestInfo);
                if (checkResult.Status != ResultStatus.Success)
                {
                    ViewBag.ErrorMsg = checkResult.Message;
                    return(View());
                }

                #region 组装浏览器调起JS API支付所需的参数
                try
                {
                    var jsApiPay = new JsApiPay(System.Web.HttpContext.Current);
                    //获取授权用户信息
                    jsApiPay.GetOpenidAndAccessTokenFromCode(code);
                    //获取订单支付金额
                    int paymentAmt = (int)(requestInfo.PaymentAmt * 100);//微信支付金额的单位为“分”,所以要乘以100
                    //异步通知url
                    string notifyUrl = string.Format("http://{0}/SwiftPassWeChatPay/OnlinePayNotify", AppConfig.Global.Domain);

                    var      orderInfo     = JsonHelper.Deserialize <PayOrderInfo>(requestInfo.RequestData);
                    DateTime orderEndTime  = DateTime.ParseExact(orderInfo.OrderTime, "yyyyMMddHHmmss", new CultureInfo("zh-CN", true)).AddHours(24);
                    DateTime minExpireTime = DateTime.Now.AddMinutes(6);//为保险,多加1分钟
                    //交易过期时间(最短过期时间间隔必须大于5分钟)
                    string expireTime = (orderEndTime > minExpireTime ? orderEndTime : minExpireTime).ToString("yyyyMMddHHmmss");
                    //获取调起JS API的参数
                    ViewBag.JsApiParams = SwiftPassPayApi.WeChatJsApiPay(requestInfo.OrderId, paymentAmt, notifyUrl, expireTime, jsApiPay.openid);
                    //订单编号
                    ViewBag.OrderId = requestInfo.OrderId;

                    //异常时返回的业务系统着陆页面
                    var resultInterface = Builder.BuildSwiftPassWeChatPayResult();
                    var notifyInfo      = new PayNotifyInfo()
                    {
                        OrderId    = requestInfo.OrderId,
                        TradeNo    = "",
                        PaymentAmt = requestInfo.PaymentAmt.ToString(),
                        Result     = ((int)ResultStatus.Error).ToString(),
                    };
                    ViewBag.ReturnUrl = resultInterface.GetReturnUrl(requestInfo, notifyInfo);
                }
                catch (BizException bex)
                {
                    requestInfo.ResultDesc    = bex.Message;
                    requestInfo.ExecuteResult = (int)ResultStatus.Error;
                    PayRequestDAL.Update(requestInfo);

                    ViewBag.ErrorMsg = bex.Message;
                    return(View());
                }
                catch (Exception ex)
                {
                    requestInfo.ExecuteResult = (int)ResultStatus.Error;
                    requestInfo.ResultDesc    = ex.ToString();
                    PayRequestDAL.Update(requestInfo);
                    ViewBag.ErrorMsg = "系统执行时发生异常:" + ex.Message;
                    return(View());
                }
                #endregion

                //支付请求执行成功
                onlinePay.ExecuteSuccess(requestInfo);
            }
            catch (Exception ex)
            {
                ViewBag.ErrorMsg = "系统执行时发生异常:" + ex.Message;
                string log = string.Format(@"WAP支付JSAPI发生异常!{0}异常描述:{1}{0}异常堆栈:{2}{0}请求参数:requestSysNo={3} code={4}",
                                           Environment.NewLine, ex.Message, ex.StackTrace, requestSysNo, code);
                LogWriter.WriteLog(log, AppConfig.Global.SwiftPassWeChatPayLogFolder, ExceptionHelper.ExceptionLevel.Exception);
            }
            return(View());
        }