Esempio n. 1
0
        /// <summary>
        /// 微信的异步支付返回
        /// </summary>
        /// <returns></returns>
        public ActionResult WetChatNotify()
        {
            try
            {
                //需验证支付结果
                WxPayData notifyData = GetNotifyData();

                PayLog notity2 = new PayLog();
                notity2.ID      = FCake.Core.Common.DataHelper.GetSystemID();
                notity2.LogTime = DateTime.Now;
                notity2.Message = "notity2接收到的数据:" + notifyData.ToJson().ToString();
                log.Add(notity2);

                WxPayData res = new WxPayData();
                //检查支付结果中transaction_id是否存在
                if (!notifyData.IsSet("transaction_id"))
                {
                    //若transaction_id不存在,则立即返回结果给微信支付后台
                    res.SetValue("return_code", "FAIL");
                    res.SetValue("return_msg", "支付结果中微信订单号不存在");
                    PayLog notity3 = new PayLog();
                    notity3.ID      = FCake.Core.Common.DataHelper.GetSystemID();
                    notity3.LogTime = DateTime.Now;
                    notity3.Message = "notity3接收到的数据:没有transaction_id";
                    log.Add(notity3);
                }

                string transaction_id = notifyData.GetValue("transaction_id").ToString();

                //查询订单,判断订单真实性
                if (!QueryOrder(transaction_id))
                {
                    //若订单查询失败,则立即返回结果给微信支付后台
                    res.SetValue("return_code", "FAIL");
                    res.SetValue("return_msg", "订单查询失败");
                }
                //查询订单成功
                else
                {
                    res.SetValue("return_code", "SUCCESS");
                    res.SetValue("return_msg", "OK");
                    var orderId = notifyData.GetValue("out_trade_no").ToString();

                    PayLog notity4 = new PayLog();
                    notity4.ID      = FCake.Core.Common.DataHelper.GetSystemID();
                    notity4.LogTime = DateTime.Now;
                    notity4.Message = "notity4接收到的out_trade_no数据:" + orderId;
                    log.Add(notity4);

                    var preInfo = new PrePayInfoService().GetPrePayByPrePayNo(orderId);

                    var order = psv.GetOrderByOrderNo(preInfo.OrderNo);//获取订单信息
                    if (order.Status == OrderStatus.NotPay)
                    {
                        PayLog notity5 = new PayLog();
                        notity5.ID      = FCake.Core.Common.DataHelper.GetSystemID();
                        notity5.LogTime = DateTime.Now;
                        notity5.Message = "notity5开始修改" + order.No + "订单状态:";
                        log.Add(notity5);
                        psv.FinishOrder(order.No, transaction_id, FeeType.WXPay);
                    }
                }
                return(Content(res.ToString()));
            }
            catch (Exception e)
            {
                #region 回调异常日志
                PayLog notity99 = new PayLog();
                notity99.ID      = FCake.Core.Common.DataHelper.GetSystemID();
                notity99.LogTime = DateTime.Now;
                notity99.Message = "回调发生异常" + e.Message;
                log.Add(notity99);
                return(Content("error"));

                #endregion
            }
        }
Esempio n. 2
0
        /// <summary>
        /// 手机微信支付,统一支付接口
        /// </summary>
        /// <returns></returns>
        public ActionResult WXPay(string id)
        {
            try
            {
                OpResult result = new OpResult();
                result.Successed = false;
                var order = psv.GetOrderByOrderNo(id);//获取订单信息
                ViewBag.orderNo = id;
                //微信预支付数据为单订单发起多次支付
                PrePayInfo info = new PrePayInfo();
                info.OrderNo    = order.No;
                info.PrePayNo   = FCake.Core.Common.DataHelper.GetSystemID();
                info.NeedPay    = int.Parse(order.NeedPay.ToString().Split('.')[0]) * 100;
                info.LogingTime = DateTime.Now;
                bool rt = new PrePayInfoService().AddPayInfo(info);
                if (rt)
                {
                    #region 预支付数据成功创建日志记录
                    PayLog log_prePayData = new PayLog();
                    log_prePayData.ID      = FCake.Core.Common.DataHelper.GetSystemID();
                    log_prePayData.LogTime = DateTime.Now;
                    log_prePayData.Message = "创建微信支付id:" + info.PrePayNo + "成功";
                    log.Add(log_prePayData);
                    #endregion
                }

                if (order.FeeType != FeeType.WXPay && order.Status != 0)
                {
                    result.Message = "订单状态异常!";
                    return(Json(result));
                }
                #region 获取tocken
                var appid  = WxPayConfig.APPID;     //"wx8bf0e66bf9f6a009";
                var secret = WxPayConfig.APPSECRET; // "6b783c1339f64a7638158ccdfaf216f1";
                var code   = string.Empty;
                var openid = string.Empty;
                var client = new System.Net.WebClient();
                client.Encoding = System.Text.Encoding.UTF8;
                if (Session["code"] == null)
                {
                    var myurl = Request.Url.Scheme + "://" + Request.Url.Host + "/tenpay/ResponseParam";//获取code的地址
                    var url   = string.Format("https://open.weixin.qq.com/connect/oauth2/authorize?appid={0}&redirect_uri={1}&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect", appid, myurl);

                    return(Redirect(url));
                }
                else
                {
                    code = Session["code"].ToString();
                    var url  = string.Format("https://api.weixin.qq.com/sns/oauth2/access_token?appid={0}&secret={1}&code={2}&grant_type=authorization_code", appid, secret, code);
                    var data = client.DownloadString(url);
                    #region 获取微信access_token结果日志记录
                    //记录返回的access_token
                    PayLog log_accessToken = new PayLog();
                    log_accessToken.ID      = FCake.Core.Common.DataHelper.GetSystemID();
                    log_accessToken.LogTime = DateTime.Now;
                    log_accessToken.Message = "accessToken:请求:" + url + "返回:" + data;
                    log.Add(log_accessToken);
                    //token end
                    #endregion
                    var    serializer = new JavaScriptSerializer();
                    var    obj        = serializer.Deserialize <Dictionary <string, string> >(data);
                    string accessToken;
                    if (!obj.TryGetValue("access_token", out accessToken))
                    {
                        return(View());
                    }

                    var opentid = obj["openid"];
                    url  = string.Format("https://api.weixin.qq.com/sns/userinfo?access_token={0}&openid={1}&lang=zh_CN", accessToken, opentid);
                    data = client.DownloadString(url);
                    #region 获取微信支付openid结果日志
                    //记录返回的openid
                    PayLog log_openid = new PayLog();
                    log_openid.ID      = FCake.Core.Common.DataHelper.GetSystemID();
                    log_openid.LogTime = DateTime.Now;
                    log_openid.Message = "openid:" + data;
                    log.Add(log_openid);
                    //token end
                    #endregion
                    var userInfo = serializer.Deserialize <Dictionary <string, object> >(data);

                    foreach (var key in userInfo.Keys)
                    {
                        if (key == "openid")
                        {
                            openid = userInfo[key].ToString();
                            break;
                        }
                    }
                }

                //openid get end

                #endregion

                ////若传递了相关参数,则调统一下单接口,获得后续相关接口的入口参数
                JsApiPay jsApiPay = new JsApiPay();
                jsApiPay.hostStr  = Request.Url.Host;
                jsApiPay.pathStr  = Request.Path;
                jsApiPay.queryStr = Request.Url.Query;
                jsApiPay.codeVal  = code;
                jsApiPay.orderNo  = info.PrePayNo;//订单号

                jsApiPay.openid    = openid;
                jsApiPay.total_fee = Convert.ToInt32((order.NeedPay * 100).ToString().Split('.')[0]); //订单金额,先写死为1   int.Parse((order.NeedPay * 100).ToString());

                //JSAPI支付预处理

                WxPayData unifiedOrderResult = jsApiPay.GetUnifiedOrderResult();

                #region 请求预支付id发送数据日志
                PayLog log_sendPrePayData = new PayLog();
                log_sendPrePayData.ID      = FCake.Core.Common.DataHelper.GetSystemID();
                log_sendPrePayData.LogTime = DateTime.Now;
                log_sendPrePayData.Message = "请求预字符id发送数据:" + unifiedOrderResult.ToXml().ToString();
                log.Add(log_sendPrePayData);
                #endregion


                var wxJsApiParam = jsApiPay.GetJsApiParameters();//获取H5调起JS API参数

                //记录的Exception
                #region 调jsapi支付参数日志
                PayLog log_sendJsApiData = new PayLog();
                log_sendJsApiData.ID      = FCake.Core.Common.DataHelper.GetSystemID();
                log_sendJsApiData.LogTime = DateTime.Now;
                log_sendJsApiData.Message = "pl20:" + wxJsApiParam;
                log.Add(log_sendJsApiData);
                #endregion
                //Exception end
                //在页面上显示订单信息
                ViewBag.PayInfo = wxJsApiParam;

                if (Session["code"] != null)
                {
                    Session.Remove("code");
                }
                if (Session["orderid"] != null)
                {
                    Session.Remove("orderid");
                }


                return(View());
            }
            catch (Exception e)
            {
                #region 异常日志
                //记录的Exception
                PayLog log_Exception = new PayLog();
                log_Exception.ID      = FCake.Core.Common.DataHelper.GetSystemID();
                log_Exception.LogTime = DateTime.Now;
                log_Exception.Message = "error:" + e.Message;
                log.Add(log_Exception);
                //Exception end
                #endregion
            }

            return(View());
        }