/// <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="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); }
/// <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); }
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 })); } }
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 })); } }
/// <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="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); }
/// <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); }
/// <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()); }
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 })); } }
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")); }
/// <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> /// 校验在线支付参数 /// </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); }
/// <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); }
/// <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()); }