public ApiResult GetWxPayJsApiParam([FromBody] PayViewModel payModel) { var orderId = payModel.OrderId; if (orderId.Equals(Guid.Empty)) { throw new WebApiInnerException("0001", "订单Id不合法"); } var order = _currencyService.GetSingleById <Order>(orderId); if (order == null) { throw new WebApiInnerException("0002", "订单数据不存在"); } if (order.PayStatus != PayStatus.Unpaid) { throw new WebApiInnerException("0003", "订单状态不合理,无法支付"); } var payment = _paymentService.LoadPayment(PaymentType.WeiXin.ToString()); if (payment == null || !payment.Enabled) { throw new WebApiInnerException("0004", "支付方式不合法或已停用"); } var paymentDispatcher = HostConstObject.Container.ResolveNamed <IPaymentDispatcher>(payment.Code.ToLower()); if (paymentDispatcher == null) { throw new WebApiInnerException("0005", "支付方式不合法"); } var oath = _currencyService.GetSingleByConditon <UserOAuth>(ua => ua.MemberId == order.MemberId && ua.OAuthType == OAuthType.WeiXin); if (oath == null) { throw new WebApiInnerException("0008", "未绑定微信号,无法支付"); } var result = new ApiResult(); try { var routeParas = new RouteValueDictionary { { "area", PaymentProcessModule.Area }, { "controller", "Receive" }, { "action", "AsyncReturn" }, { "paymentCode", payment.Code } }; var notifyUrl = HostConstObject.HostUrl + _urlHelper.RouteUrl(routeParas); if (payModel.UseBalance == 1) { //使用余额付款 #region using (TransactionScope scope = new TransactionScope()) { var cashWallet = _walletService.GetWalletByMemberId(order.MemberId, Wallet.Models.WalletType.Cash); if (cashWallet != null && cashWallet.Available > 0) { if (cashWallet.Available > order.PayFee) { string error; _walletService.Draw(order.MemberId, Wallet.Models.WalletType.Cash, order.PayFee, "支付订单" + order.OrderNo, out error); if (string.IsNullOrWhiteSpace(error)) { order.BalancePay = order.PayFee; order.OrderStatus = OrderStatus.WaitingForDelivery; order.PayStatus = PayStatus.Paid; order.PayTime = DateTime.Now; var balancePayment = _paymentService.LoadPayment(PaymentType.Balance.ToString()); order.PaymentId = balancePayment.Id; order.PaymentName = balancePayment.Name; _orderService.ChangeOrderStatus(order.Id, order.OrderStatus, order.PayStatus); _currencyService.Update(order); } } else { string error; _walletService.Draw(order.MemberId, Wallet.Models.WalletType.Cash, cashWallet.Available, "支付订单" + order.OrderNo, out error); if (string.IsNullOrWhiteSpace(error)) { order.UnpayFee = order.PayFee - cashWallet.Available; order.BalancePay = cashWallet.Available; _currencyService.Update(order); } } } scope.Complete(); } #endregion } var payLog = new PayLog { Id = KeyGenerator.GetGuidKey(), TransactionNo = $"{order.OrderNo}{KeyGenerator.GenerateRandom(1000, 1)}", OrderId = order.Id, OrderNo = order.OrderNo, OrderAmount = order.PayFee,//UnpayFee PaymentId = payment.Id, PaymentName = payment.Name, CreateTime = DateTime.Now, LogStatus = LogStatus.Unpaid }; if (!_currencyService.Create(payLog)) { throw new WebApiInnerException("0007", "生成支付流水失败"); } string timeStamp = ""; string nonceStr = ""; string paySign = ""; var appId = _configService.Get <WeiXinConfig>().AppId; var mchId = _configService.Get <WeiXinConfig>().MchId; var key = _configService.Get <WeiXinConfig>().Key; //创建支付应答对象 WxRequestHandler packageReqHandler = new WxRequestHandler(null); //初始化 packageReqHandler.Init(); timeStamp = TenPayV3Util.GetTimestamp(); nonceStr = TenPayV3Util.GetNoncestr(); //设置package订单参数 packageReqHandler.SetParameter("appid", appId); //公众账号ID packageReqHandler.SetParameter("mch_id", mchId); //商户号 packageReqHandler.SetParameter("nonce_str", nonceStr); //随机字符串 packageReqHandler.SetParameter("body", order.OrderNo); //商品信息 packageReqHandler.SetParameter("out_trade_no", payLog.TransactionNo); //商家订单号 packageReqHandler.SetParameter("total_fee", Convert.ToInt32(order.PayFee * 100).ToString()); //商品金额,以分为单位(money * 100).ToString() packageReqHandler.SetParameter("spbill_create_ip", "127.0.0.1"); //用户的公网ip,不是商户服务器IP packageReqHandler.SetParameter("notify_url", notifyUrl); //接收财付通通知的URL packageReqHandler.SetParameter("trade_type", TenPayV3Type.JSAPI.ToString()); //交易类型 packageReqHandler.SetParameter("openid", oath.OAuthId); //用户的openId string sign = packageReqHandler.CreateMd5Sign("key", key); packageReqHandler.SetParameter("sign", sign); //签名 string data = packageReqHandler.ParseXML(); var orderResult = TenPayV3.Unifiedorder(data); var res = XDocument.Parse(orderResult); var prepayXml = res.Element("xml").Element("prepay_id"); if (prepayXml == null) { Logger.Error("生成微信预付单失败:" + res.ToString()); throw new WebApiInnerException("0009", "生成微信预付单失败"); //res.Element("xml").Element("return_msg").Value; } string prepayId = prepayXml.Value; //设置支付参数 WxRequestHandler paySignReqHandler = new WxRequestHandler(null); paySignReqHandler.SetParameter("appId", appId); paySignReqHandler.SetParameter("timeStamp", timeStamp); paySignReqHandler.SetParameter("nonceStr", nonceStr); paySignReqHandler.SetParameter("package", $"prepay_id={prepayId}"); paySignReqHandler.SetParameter("signType", "MD5"); paySign = paySignReqHandler.CreateMd5Sign("key", key); result.SetData(new { appId, timeStamp, nonceStr, package = $"prepay_id={prepayId}", paySign, signType = "MD5", orderid = order.Id, orderType = order.ModuleKey, orderStatus = order.OrderStatus, payStatus = order.PayStatus }); } catch (Exception ex) { Logger.Error(ex, "获取订单支付签名数据失败"); throw new WebApiInnerException("0006", "生成签名数据出现异常"); } return(result); }
private ActionResult JsApiPayProcess(string code, string state) { var needOath = !code.StartsWith("|"); if (string.IsNullOrEmpty(code)) { return(Content("您拒绝了授权!")); } //获取产品信息 var orderId = state.ToGuid(); if (orderId.Equals(Guid.Empty)) { return(Content("订单Id不合法!")); } var order = _orderService.Load(orderId); if (order == null) { return(Content("订单数据不存在!")); } if (order.OrderStatus != OrderStatus.PendingPayment && order.PayStatus != PayStatus.Unpaid) { return(Content("订单状态不合理,无法支付!")); } var payment = _paymentService.LoadPayment("weixin"); if (payment == null || !payment.Enabled) { return(Content("支付方式不合法或已停用!")); } string openId; if (needOath) { //通过,用code换取access_token var openIdResult = OAuthApi.GetAccessToken(AppId, AppSecret, code); if (openIdResult.errcode != ReturnCode.请求成功) { return(Content("错误:" + openIdResult.errmsg)); } openId = openIdResult.openid; } else { openId = code.Trim('|'); } var payLog = new PayLog { Id = KeyGenerator.GetGuidKey(), TransactionNo = $"{order.OrderNo}{KeyGenerator.GenerateRandom(1000, 1)}", OrderId = order.Id, OrderNo = order.OrderNo, OrderAmount = order.UnpayFee, PaymentId = payment.Id, PaymentName = payment.Name, CreateTime = DateTime.Now, LogStatus = LogStatus.Unpaid }; if (!_currencyService.Create(payLog)) { throw new WebApiInnerException("0007", "生成支付流水失败"); } string timeStamp = ""; string nonceStr = ""; string paySign = ""; //创建支付应答对象 WxRequestHandler packageReqHandler = new WxRequestHandler(null); //初始化 packageReqHandler.Init(); timeStamp = TenPayV3Util.GetTimestamp(); nonceStr = TenPayV3Util.GetNoncestr(); var routeParas = new RouteValueDictionary { { "area", PaymentProcessModule.Area }, { "controller", "Receive" }, { "action", "AsyncReturn" }, { "paymentCode", "WeiXin" } }; var notifyUrl = HostConstObject.HostUrl + _urlHelper.RouteUrl(routeParas); //设置package订单参数 packageReqHandler.SetParameter("appid", AppId); //公众账号ID packageReqHandler.SetParameter("mch_id", MchId); //商户号 packageReqHandler.SetParameter("nonce_str", nonceStr); //随机字符串 packageReqHandler.SetParameter("body", order.OrderNo); //商品信息 packageReqHandler.SetParameter("out_trade_no", payLog.TransactionNo); //商家订单号 packageReqHandler.SetParameter("total_fee", Convert.ToInt32(payLog.OrderAmount * 100).ToString()); //商品金额,以分为单位(money * 100).ToString() packageReqHandler.SetParameter("spbill_create_ip", Request.UserHostAddress); //用户的公网ip,不是商户服务器IP packageReqHandler.SetParameter("notify_url", notifyUrl); //接收财付通通知的URL packageReqHandler.SetParameter("trade_type", TenPayV3Type.JSAPI.ToString()); //交易类型 packageReqHandler.SetParameter("openid", openId); //用户的openId string sign = packageReqHandler.CreateMd5Sign("key", Key); packageReqHandler.SetParameter("sign", sign); //签名 string data = packageReqHandler.ParseXML(); #pragma warning disable 618 var result = TenPayV3.Unifiedorder(data); #pragma warning restore 618 var res = XDocument.Parse(result); var prepayXml = res.Element("xml").Element("prepay_id"); if (prepayXml == null) { return(Content(res.Element("xml").Element("return_msg").Value)); } string prepayId = prepayXml.Value; //设置支付参数 WxRequestHandler paySignReqHandler = new WxRequestHandler(null); paySignReqHandler.SetParameter("appId", AppId); paySignReqHandler.SetParameter("timeStamp", timeStamp); paySignReqHandler.SetParameter("nonceStr", nonceStr); paySignReqHandler.SetParameter("package", $"prepay_id={prepayId}"); paySignReqHandler.SetParameter("signType", "MD5"); paySign = paySignReqHandler.CreateMd5Sign("key", Key); ViewData["appId"] = AppId; ViewData["timeStamp"] = timeStamp; ViewData["nonceStr"] = nonceStr; ViewData["package"] = $"prepay_id={prepayId}"; ViewData["paySign"] = paySign; return(null); }