/// <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); }
/// <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); }
/// <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); }
/// <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); }
/// <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); }
/// <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()); }