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));
            }
        }
Exemple #2
0
        /// <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);
            }
        }
Exemple #3
0
 /// <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=支付异常..."));
            }
        }
Exemple #5
0
 /// <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 }));
     }
 }