/// <summary>
        /// 查询订单的支付结果
        /// </summary>
        /// <param name="orderId">订单编号</param>
        /// <param name="tradeNo">交易流水号</param>
        /// <returns></returns>
        public ActionResult Query(string orderId = "", string tradeNo = "")
        {
            HttpResponseBase response = HttpContext.Response;

            try
            {
                var resData = SwiftPassPayApi.OrderQuery(orderId, tradeNo);
                var xmlStr  = resData.ToXml(false);
                response.ContentType = "text/xml";
                response.Write(xmlStr);
            }
            catch (Exception ex)
            {
                response.Write("系统执行时发生异常:" + ex.Message);
            }
            return(new EmptyResult());
        }
Exemple #2
0
        /// <summary>
        /// 校验支付结果请求
        /// </summary>
        /// <param name="data">业务数据报文</param>
        /// <param name="resultInfo">支付结果记录</param>
        /// <returns></returns>
        public override ExecuteResult CheckRequest(string data, PayResultInfo resultInfo)
        {
            var result = new ExecuteResult();

            try
            {
                //校验请求报文
                var notifyData = new ParameterData();
                notifyData.FromXml(data);
                resultInfo.OrderId = notifyData.GetValue("out_trade_no");
                if (notifyData.GetValue("status") != "0") //校验返回状态
                {
                    throw new BizException("返回状态错误代码:" + notifyData.GetValue("status") + ",错误信息:" + notifyData.GetValue("message"));
                }

                if (!SwiftPassCore.CheckSign(notifyData)) //校验数据签名
                {
                    throw new BizException("签名校验未通过");
                }

                if (notifyData.GetValue("result_code") != "0") //校验业务结果
                {
                    throw new BizException("业务结果错误代码:" + notifyData.GetValue("err_code") + ",错误信息:" + notifyData.GetValue("err_msg"));
                }

                if (notifyData.GetValue("pay_result") != "0") //校验支付结果
                {
                    resultInfo.ExecuteResult = (int)ResultStatus.Failure;
                    resultInfo.ResultDesc    = "用户支付失败:" + notifyData.GetValue("pay_info");
                    PayResultDAL.Update(resultInfo);

                    result.Message = resultInfo.ResultDesc;
                    result.Status  = ResultStatus.Failure;
                    return(result);
                }

                //检查支付结果中transaction_id是否存在
                resultInfo.TradeNo = notifyData.GetValue("transaction_id");
                if (string.IsNullOrEmpty(resultInfo.TradeNo))
                {
                    resultInfo.ExecuteResult = (int)ResultStatus.Failure;
                    resultInfo.ResultDesc    = "支付结果中平台交易单号不存在";
                    PayResultDAL.Update(resultInfo);

                    result.Message = resultInfo.ResultDesc;
                    result.Status  = ResultStatus.Failure;
                    return(result);
                }

                //查询支付单,判断支付单真实性
                var queryData = SwiftPassPayApi.OrderQuery(resultInfo.OrderId, resultInfo.TradeNo);
                if (queryData.GetValue("status") != "0" || //校验返回状态
                    queryData.GetValue("result_code") != "0" || //校验业务结果
                    !SwiftPassCore.CheckSign(queryData) || //校验数据签名
                    queryData.GetValue("trade_state") != "SUCCESS")    //校验交易状态
                {
                    resultInfo.ExecuteResult = (int)ResultStatus.Failure;
                    resultInfo.ResultDesc    = "平台交易单号查询失败";
                    PayResultDAL.Update(resultInfo);

                    result.Message = resultInfo.ResultDesc;
                    result.Status  = ResultStatus.Failure;
                    return(result);
                }
            }
            catch (BizException wex)
            {
                resultInfo.ExecuteResult = (int)ResultStatus.Error;
                resultInfo.ResultDesc    = wex.Message;
                PayResultDAL.Update(resultInfo);

                result.Message = resultInfo.ResultDesc;
                result.Status  = ResultStatus.Error;
                return(result);
            }
            result.Status = ResultStatus.Success;
            return(result);
        }
        /// <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());
        }
        /// <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());
        }