Example #1
0
        public void ProcessNotify()
        {
            SceneryDomain sceneryDomain = new SceneryDomain();

            try
            {
                WxPayData notifyData = null;
                WxPayData res        = null;
                try
                {
                    notifyData = GetNotifyData(sceneryDomain);
                }
                catch (WxPayException ex)
                {
                    //若签名错误,则立即返回结果给微信支付后台
                    res = new WxPayData();
                    res.SetValue("return_code", "FAIL");
                    res.SetValue("return_msg", ex.Message);
                    LogHelper.WeChatLog("Sign check error : " + res.ToXml());
                    ResponseMessage.Content = new StringContent(res.ToXml());
                    return;
                }
                //检查支付结果中transaction_id是否存在
                if (!notifyData.IsSet("transaction_id"))
                {
                    //若transaction_id不存在,则立即返回结果给微信支付后台
                    res = new WxPayData();
                    res.SetValue("return_code", "FAIL");
                    res.SetValue("return_msg", "支付结果中微信订单号不存在");
                    LogHelper.WeChatLog("The Pay result is error : " + res.ToXml());

                    ResponseMessage.Content = new StringContent(res.ToXml());

                    return;
                }

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

                //查询订单,判断订单真实性
                var queryResult = QueryOrder(transaction_id, sceneryDomain.WeChat);

                if (queryResult == null)
                {
                    //若订单查询失败,则立即返回结果给微信支付后台
                    res = new WxPayData();
                    res.SetValue("return_code", "FAIL");
                    res.SetValue("return_msg", "订单查询失败");
                    LogHelper.WeChatLog("Order query failure : " + res.ToXml());
                    ResponseMessage.Content = new StringContent(res.ToXml());
                    return;
                }
                //查询订单成功
                else
                {
                    //业务处理
                    var detailDao = new WeChatDetailDao();
                    var qrCodeDao = new WeChatQRCodeDao();
                    //支付成功 查询交易信息
                    WeChatDetailDomain detail = new WeChatDetailDomain();
                    detail.Out_trade_no = queryResult.GetValue("out_trade_no").ToString();
                    detail.Total_fee    = Convert.ToInt32(queryResult.GetValue("total_fee"));


                    //需要检查数据库中是否有改数据 有的话 直接返回
                    var QRCodeDetail = qrCodeDao.IsExistOut_trade_no(detail.Out_trade_no, detail.Total_fee, sceneryDomain.WeChat.APPID);

                    if (QRCodeDetail == null || QRCodeDetail.SceneryName == "-1")
                    {
                        LogHelper.WeChatLog("论寻:无通知参数");
                        res = new WxPayData();
                        res.SetValue("return_code", "FAIL");
                        res.SetValue("return_msg", "无通知参数");
                        LogHelper.WeChatLog("Order query failure : " + res.ToXml());
                        ResponseMessage.Content = new StringContent(res.ToXml());
                        return;
                    }

                    if (QRCodeDetail.SceneryName != "-2")
                    {
                        //保存微信信息
                        detail.SceneryName    = QRCodeDetail.SceneryName;
                        detail.Creater        = sceneryDomain.WeChat.APPID;
                        detail.Updater        = "";
                        detail.AppId          = sceneryDomain.WeChat.APPID;
                        detail.BatchNumber    = QRCodeDetail.BatchNumber;
                        detail.SceneryRate    = QRCodeDetail.SceneryRate;
                        detail.Time_end       = DateTime.ParseExact(queryResult.GetValue("time_end").ToString(), "yyyyMMddHHmmss", System.Globalization.CultureInfo.CurrentCulture);
                        detail.WeChatPlayDate = Convert.ToDateTime(detail.Time_end.ToString("yyyy-MM-dd"));

                        detail.Err_code             = "Success";
                        detail.Err_code_des         = "异步";
                        detail.Openid               = queryResult.GetValue("openid").ToString();
                        detail.Trade_type           = queryResult.GetValue("trade_type").ToString();
                        detail.Bank_type            = queryResult.GetValue("bank_type").ToString();
                        detail.Settlement_total_fee = Convert.ToInt32(queryResult.GetValue("settlement_total_fee"));
                        detail.Transaction_id       = queryResult.GetValue("transaction_id").ToString();
                        detailDao.Add(detail);
                    }
                    else
                    {
                        //论寻:数据已经存在,不需要插入
                        LogHelper.WeChatLog("论寻:数据已经存在,不需要插入");
                    }

                    res = new WxPayData();
                    res.SetValue("return_code", "SUCCESS");
                    res.SetValue("return_msg", "OK");
                    LogHelper.WeChatLog("order query success : " + res.ToXml());
                    ResponseMessage.Content = new StringContent(res.ToXml());
                }
            }
            catch (Exception ex)
            {
                LogHelper.WeChatLog("Notify 异常:" + ex.Message);

                WxPayData res = new WxPayData();
                res.SetValue("return_code", "FAIL");
                res.SetValue("return_msg", "系统异常");
                LogHelper.WeChatLog("Sign check error : " + res.ToXml());
                ResponseMessage.Content = new StringContent(res.ToXml());
            }
        }
Example #2
0
        /**
         *
         * 统一下单
         * @param WxPaydata inputObj 提交给统一下单API的参数
         * @param int timeOut 超时时间
         * @throws WxPayException
         * @return 成功时返回,其他抛异常
         */
        public static WxPayData UnifiedOrder(WxPayData inputObj, WxPayConfigDomain WxPayConfig, int timeOut = 6)
        {
            string url = "https://api.mch.weixin.qq.com/pay/unifiedorder";

            //检测必填参数
            if (!inputObj.IsSet("out_trade_no"))
            {
                throw new WxPayException("缺少统一支付接口必填参数out_trade_no!");
            }
            else if (!inputObj.IsSet("body"))
            {
                throw new WxPayException("缺少统一支付接口必填参数body!");
            }
            else if (!inputObj.IsSet("total_fee"))
            {
                throw new WxPayException("缺少统一支付接口必填参数total_fee!");
            }
            else if (!inputObj.IsSet("trade_type"))
            {
                throw new WxPayException("缺少统一支付接口必填参数trade_type!");
            }

            //关联参数
            if (inputObj.GetValue("trade_type").ToString() == "JSAPI" && !inputObj.IsSet("openid"))
            {
                throw new WxPayException("统一支付接口中,缺少必填参数openid!trade_type为JSAPI时,openid为必填参数!");
            }
            if (inputObj.GetValue("trade_type").ToString() == "NATIVE" && !inputObj.IsSet("product_id"))
            {
                throw new WxPayException("统一支付接口中,缺少必填参数product_id!trade_type为JSAPI时,product_id为必填参数!");
            }

            //异步通知url未设置,则使用配置文件中的url
            if (!inputObj.IsSet("notify_url"))
            {
                inputObj.SetValue("notify_url", "http://alipayapi.zhilvtx.com/API/WeChat/Notify");//异步通知url
            }

            inputObj.SetValue("appid", WxPayConfig.APPID);      //公众账号ID
            inputObj.SetValue("mch_id", WxPayConfig.MCHID);     //商户号
            //inputObj.SetValue("spbill_create_ip", WxPayConfig.IP);//终端ip
            inputObj.SetValue("nonce_str", GenerateNonceStr()); //随机字符串

            //签名
            inputObj.SetValue("sign", inputObj.MakeSign(WxPayConfig.PAYKEY));
            string xml   = inputObj.ToXml();
            var    start = DateTime.Now;

            LogHelper.WeChatLog(string.Format("商户订单号:{0} 请求:{1}", inputObj.GetValue("out_trade_no"), xml));

            string response = HttpService.Post(xml, url, false, timeOut);

            LogHelper.WeChatLog(string.Format("WxPayApi:UnfiedOrder response :", response));
            var end      = DateTime.Now;
            int timeCost = (int)((end - start).TotalMilliseconds);

            WxPayData result = new WxPayData();

            result.FromXml(response, WxPayConfig.PAYKEY);

            ReportCostTime(url, timeCost, result, WxPayConfig);//测速上报

            return(result);
        }