public ActionResult wxPay(string total_fee, string sb) { string guid = Request["userId"]; var user = Common.CacheHelper.Get(guid) as PersonalUser; if (user == null) { return(Json(new { success = "false", str = "您还没登陆,请先登陆后操作!" }, JsonRequestBehavior.AllowGet)); } string xml = null; string trade_no = WxPayApi.GenerateOutTradeNo(); try { xml = new WXPay() { body = "爽赞网(爽币)充值", //费用名称,这会显示 detail = "爽赞网", //微信名称 attach = string.Format("{0},{1}", user.Id, sb), //自定义数据,这里给充值数量和用户ID out_trade_no = trade_no, //商户订单号 total_fee = int.Parse(total_fee) * 100 // total_fee=1 用户测试数据 }.pay(); if (xml.IsNullOrEmpty()) { return(Json(new { success = "false", str = "微信下单超时失败!" }, JsonRequestBehavior.AllowGet)); } XElement xe = XElement.Parse(xml); if (xe.Element("code_url") == null) { LogHelper.WriteLog(xml); return(Json(new { success = "false", str = "微信统一下单失败!" }, JsonRequestBehavior.AllowGet)); } return(Json(new { success = "true", trade_no = trade_no, url = xe.Element("code_url").Value }, JsonRequestBehavior.AllowGet)); } catch (Exception e) { LogHelper.WriteLog(xml + "\r\n" + e.ToString()); return(Json(new { success = "false", str = "微信下单失败!" }, JsonRequestBehavior.AllowGet)); } }
/// <summary> /// 支付成功更新订单 /// </summary> /// <param name="order_no">网站订单号</param> /// <param name="trade_no">网银订单号</param> /// <param name="pay_type">支付类型</param> /// <param name="pay_amount">在线支付金额</param> /// <param name="remarks">返回的支付备注信息</param> /// <returns>返回调用结果</returns> public static bool payOrder(string order_no) { using (EFDB db = new EFDB()) { bool isok = false; string pay = WXPay.Get_Order(order_no); if (!string.IsNullOrEmpty(pay)) { //获取返回的支付参数 JObject payJson = JsonConvert.DeserializeObject(pay) as JObject; string trade_no = payJson["trade_no"].ToString(); string attach = payJson["attach"].ToString(); int pay_type = Int32.Parse(payJson["pay_type"].ToString()); decimal pay_amount = decimal.Parse(payJson["pay_amount"].ToString()); //解析备注信息 JObject paramJson = JsonConvert.DeserializeObject(attach) as JObject; int type = Int32.Parse(paramJson["type"].ToString()); string LogMsg = "订单号:" + order_no + ",网银订单号:" + trade_no + ",支付类型:" + pay_type.ToString() + ",网上支付金额:" + pay_amount.ToString() + ",备注:" + attach; //支付类型 string payname = ((PayType)Enum.Parse(typeof(LJShengHelper.PayType), pay_type.ToString())).ToString(); var b = db.lorder.Where(l => l.order_no == order_no).FirstOrDefault(); if (b != null && b.pay_status == 2) { if (b.price == pay_amount) { b.pay_status = 1; } else { b.pay_status = 5; } b.trade_no = trade_no; b.pay_time = DateTime.Now; b.pay_type = pay_type; b.pay_price = pay_amount; b.express_status = 1; //b.remarks = remarks; if (db.SaveChanges() == 1) { //type[1 = 真柏 2 = 视频 3 = 课程] if (type == 2) { Guid product_gid = (Guid)b.product_gid; Guid member_gid = b.member_gid; var p = db.product.Where(l => l.gid == product_gid).FirstOrDefault(); if (p != null) { //套餐逻辑 if (p.sort >= 10000) { int number = (int)p.extend4; if (db.member.Where(l => l.gid == member_gid).Update(l => new member { number = l.number + number }) == 1) { isok = true; } else { LogManager.WriteLog("对账增加会员次数失败", "product_gid=" + product_gid.ToString() + ",member_gid=" + member_gid.ToString()); } } else { //单独购买视频 var vr = new video_record(); vr.gid = Guid.NewGuid(); vr.add_time = DateTime.Now; vr.product_gid = product_gid; vr.member_gid = member_gid; vr.video_time = DateTime.Now; vr.number = (int)db.product.Where(l => l.gid == product_gid).FirstOrDefault().extend4; db.video_record.Add(vr); if (db.SaveChanges() == 1) { isok = true; } else { LogManager.WriteLog("对账增加观看记录失败", "product_gid=" + product_gid.ToString() + ",member_gid=" + member_gid.ToString()); } } } } else { isok = true; //扣除库存 Guid ordergid = db.lorder.Where(l => l.order_no == order_no).FirstOrDefault().gid; var od = db.order_details.Where(l => l.order_gid == ordergid).ToList(); foreach (var dr in od) { db.product.Where(l => l.gid == dr.product_gid).Update(l => new product { extend4 = l.extend4 - dr.number }); } } } else { LogManager.WriteLog("支付成功更新订单失败", LogMsg); } } } else { LogManager.WriteLog("查询订单失败", order_no); } return(isok); } }
/// <summary> /// 微信下单 /// </summary> /// <param name="order_no">系统订单号</param> /// <param name="product">商品gid列表</param> /// <param name="member_gid">会员gid</param> /// <param name="openid">会员openid</param> /// <param name="type">1=真柏 2=视频 3=课程</param> /// <param name="remarks">备注</param> /// <param name="address">快递地址</param> /// <param name="consignee">收货人</param> /// <param name="contact_number">联系电话</param> /// <returns>返回调用结果</returns> /// <para name="result">200 是成功其他失败</para> /// <para name="data">对象结果</para> /// <remarks> /// 2018-08-18 林建生 /// </remarks> public static string wxpay(string order_no, string product, Guid member_gid, string openid, int type, string remarks, string address = "", string consignee = "", string contact_number = "") { using (EFDB db = new EFDB()) { //订单的gid Guid order_gid = Guid.NewGuid(); //产品金额 decimal total_price = 0; //产品名称 string body = "多个商品订单"; //添加订单产品列表 JArray json = (JArray)JsonConvert.DeserializeObject(product); Guid? product_gid = null; int number = 0; foreach (var j in json) { product_gid = Guid.Parse(j["product_gid"].ToString()); number = int.Parse(j["number"].ToString()); var p = db.product.Where(l => l.gid == product_gid).FirstOrDefault(); if (json.Count() == 1) { body = p.name; } //total_price += p.price * number; var od = new order_details(); od.gid = Guid.NewGuid(); od.add_time = DateTime.Now; od.order_gid = order_gid; od.product_gid = (Guid)product_gid; od.number = number; od.price = p.price; od.pay_price = p.price; db.order_details.Add(od); } if (db.SaveChanges() == json.Count()) { //备注 string attach = JsonConvert.SerializeObject(new { type = type, total_price, order_gid }); //string order_no = RandStr.CreateOrderNO(); total_price = db.order_details.Where(l => l.order_gid == order_gid).Sum(l => l.price * l.number); //生成订单 var b = new lorder(); b.gid = order_gid; b.add_time = DateTime.Now; b.order_no = order_no; b.member_gid = member_gid; b.pay_status = 2; b.pay_type = 2; b.total_price = total_price; b.price = total_price; b.number = type != 1 ? number: json.Count(); b.coupon_price = 0; b.express_status = 1; b.address = address; b.consignee = consignee; b.contact_number = contact_number; b.remarks = string.IsNullOrEmpty(remarks) ? attach : remarks; if (type != 1) { b.product_gid = product_gid; } db.lorder.Add(b); if (db.SaveChanges() == 1) { //开始微信统一下单 string _Pay_Package = WXPay.Get_RequestHtml(openid, order_no, total_price, body, attach); //微信jspai支付 if (_Pay_Package.Length > 0) { if (!string.IsNullOrEmpty(consignee) && !string.IsNullOrEmpty(contact_number) && !string.IsNullOrEmpty(address)) { db.member.Where(l => l.gid == member_gid).Update(l => new member { address = address, contact_number = contact_number, real_name = consignee }); } return(_Pay_Package); } else { db.lorder.Where(l => l.gid == b.gid).Delete(); return("微信下单失败"); } } else { db.order_details.Where(l => l.order_gid == order_gid).Delete(); db.lorder.Where(l => l.gid == order_gid).Delete(); return("生成订单失败"); } } else { db.order_details.Where(l => l.order_gid == order_gid).Delete(); return("生成订单列表失败"); } } }
public async Task <ActionResult> WXPay([FromServices] TengoDbContext db , int outTradeNo = 0, string code = null, int orderId = 0, int isDelaySend = 0) { //如果outTradeNo参数为空,那么是第一次进来的情况 if (outTradeNo <= 0) { #region 商场本身业务逻辑 第一次(也就是从订单点击去支付之后)进来的时候会执行这里 if (orderId <= 0) { return(Redirect("/error")); } var order = await db.Order.FirstOrDefaultAsync(p => p.Id == orderId); if (order == null) { return(Redirect("/error")); } if (order.RealAmount == 0) //如果支付金额是0元,那么有可能是活动啥的不用付钱,那么状态应该是已经支付了的,直接跳回去看看 { return(Redirect("/order/detail?id=" + order.Id)); } if (order.PayStatus) { return(Redirect("/order/detail?id=" + order.Id)); } #endregion #region 构造网页授权获取code的URL,并且重定向跳转到微信的地址 var host = HttpContext.Request.Host; var path = Request.Path; //指定获取code之后要跳回来的地址,这里我会加上订单流水号 var redirect_uri = HttpUtility.UrlEncode("https://" + host + "/payment/WXPay?outTradeNo=" + orderId); var data = new WxPayData(); data.SetValue("appid", WxPayConfig.APPID); data.SetValue("redirect_uri", redirect_uri); data.SetValue("response_type", "code"); data.SetValue("scope", "snsapi_base"); data.SetValue("state", "STATE" + "#wechat_redirect"); var url = "https://open.weixin.qq.com/connect/oauth2/authorize?" + data.ToUrl(); //触发微信返回code码 return(Redirect(url));//Redirect函数会抛出ThreadAbortException异常,不用处理这个异常 #endregion } //重定向回来之后包含了code else if (!string.IsNullOrWhiteSpace(code)) { #region GetOpenidAndAccessToken 从Url里面拿取上面第一步重定向之后返回来附带的code,然后进一步获取openid和accessToken,接着再统一下单,获取支付参数 var model = new WXPay(); #region GetOpenidAndAccessTokenFromCode(code); 先通过code构造请求来获取openid和accessToken try { //构造获取openid及access_token的url var data = new WxPayData(); data.SetValue("appid", WxPayConfig.APPID); data.SetValue("secret", WxPayConfig.APPSECRET); //写入code码,以获取openid和access_token data.SetValue("code", code); data.SetValue("grant_type", "authorization_code"); string url = "https://api.weixin.qq.com/sns/oauth2/access_token?" + data.ToUrl(); //请求url以获取数据 string result = HttpService.Get(url); //LogFactory.GetLogger().Info("WXPay", "GetOpenidAndAccessTokenFromCode响应 : " + result); //保存access_token,用于收货地址获取 var jd = JsonMapper.ToObject(result); model.access_token = (string)jd["access_token"]; //获取用户openid model.openid = (string)jd["openid"]; //LogFactory.GetLogger().Info("WXPay", "获取到的openid : " + model.openid); //LogFactory.GetLogger().Info("WXPay", "获取到的access_token : " + model.access_token); } catch (Exception ex) { //LogFactory.GetLogger().Error("WXPay", ex, remark: "GetOpenidAndAccessTokenFromCode错误"); throw new WxPayException(ex.ToString()); } #endregion try { //读取订单信息 var order = await db.Order.FirstOrDefaultAsync(p => p.Id == outTradeNo); //注意这里的订单号就要设置为流水号了 model.out_trade_no = outTradeNo.ToString(); model.total_fee = Convert.ToInt32(order.RealAmount * 100); #region 调用统一下单,获得下单结果 获取prepay_id //统一下单 var data = new WxPayData(); #region 处理商品前缀 var subject = "Teogn电商商品"; #endregion data.SetValue("body", subject); //商品描述 data.SetValue("attach", subject); //附加数据 data.SetValue("out_trade_no", model.out_trade_no); data.SetValue("total_fee", model.total_fee); data.SetValue("time_start", DateTime.Now.ToString("yyyyMMddHHmmss")); data.SetValue("time_expire", DateTime.Now.AddMinutes(10).ToString("yyyyMMddHHmmss")); data.SetValue("goods_tag", "");//订单优惠标记 data.SetValue("trade_type", "JSAPI"); data.SetValue("openid", model.openid); var unifiedOrderResult = WxPayApi.UnifiedOrder(data); if (!unifiedOrderResult.IsSet("appid") || !unifiedOrderResult.IsSet("prepay_id") || unifiedOrderResult.GetValue("prepay_id").ToString() == "") { //LogFactory.GetLogger().Info("WXPay", "统一下单报错:UnifiedOrder response error!"); throw new WxPayException("UnifiedOrder response error!"); } #endregion #region 获取H5调起JS API参数 //LogFactory.GetLogger().Info("WXPay", "JsApiPay::GetJsApiParam is processing..."); var jsApiParam = new WxPayData(); jsApiParam.SetValue("appId", unifiedOrderResult.GetValue("appid")); jsApiParam.SetValue("timeStamp", WxPayApi.GenerateTimeStamp()); jsApiParam.SetValue("nonceStr", WxPayApi.GenerateNonceStr()); jsApiParam.SetValue("package", "prepay_id=" + unifiedOrderResult.GetValue("prepay_id")); jsApiParam.SetValue("signType", "MD5"); jsApiParam.SetValue("paySign", jsApiParam.MakeSign()); model.wxJsApiParam = jsApiParam.ToJson(); //LogFactory.GetLogger().Info("WXPay", "wxJsApiParam : " + model.wxJsApiParam); #endregion ViewData.Model = model; return(View()); } catch (Exception exp) { //LogFactory.GetLogger().Error("微信支付异常", exp); return(Redirect("/error?msg=微信支付异常...")); } #endregion } else //异常情况,不用理会 { return(Redirect("/error?msg=支付异常...")); } }
/// <summary> /// 下订单返回支付参数 /// </summary> /// <param>修改备注</param> /// 2014-5-20 林建生 public object order(HttpContext context) { try { string json = ""; using (StreamReader sr = new StreamReader(context.Request.InputStream)) { json = HttpUtility.UrlDecode(sr.ReadLine()); //Server.UrlDecode } //解析参数 JObject paramJson = JsonConvert.DeserializeObject(json) as JObject; //商品列表 string product = paramJson["product"].ToString(); //购买类型[1=真柏 2=视频 3=课程] int type = int.Parse(paramJson["type"].ToString()); //会员的gid Guid member_gid = Guid.Parse(paramJson["member_gid"].ToString()); //会员的登录标识 string login_identifier = paramJson["login_identifier"].ToString(); //收货地址 string contact_number = paramJson["contact_number"].ToString(); string consignee = paramJson["consignee"].ToString(); string address = paramJson["address"].ToString(); string remarks = paramJson["remarks"].ToString(); using (EFDB db = new EFDB()) { var member = db.member.Where(l => l.gid == member_gid).FirstOrDefault(); if (member.login_identifier == login_identifier) { string order_no = RandStr.CreateOrderNO(); string _package = Helper.wxpay(order_no, product, member_gid, member.openid, type, remarks, address, consignee, contact_number); string APPID = Help.appid; string PARTNER_KEY = Help.api_key; SortedDictionary <string, string> pay_dic = new SortedDictionary <string, string>(); string wx_timeStamp = WXPay.getTimestamp(); string wx_nonceStr = WXPay.getNoncestr(); pay_dic.Add("appId", APPID); pay_dic.Add("timeStamp", wx_timeStamp); pay_dic.Add("nonceStr", wx_nonceStr); pay_dic.Add("package", _package); pay_dic.Add("signType", "MD5"); string paySign = WXPay.BuildRequest(pay_dic, PARTNER_KEY); return(new AjaxResult(new { timeStamp = wx_timeStamp, nonceStr = wx_nonceStr, signType = "MD5", paySign = paySign, package = _package, order_no = order_no })); } else { return(new AjaxResult(300, "请重新登录!")); } } } catch (Exception err) { return(new AjaxResult(300, new { Message = err.Message, Source = err.Source, StackTrace = err.StackTrace })); } }