Example #1
0
        ///////
        ///
        /// 关闭订单
        /// @param WxPayData inputObj 提交给关闭订单API的参数
        /// @param int timeOut 接口超时时间
        /// @throws WxPayException
        /// @return 成功时返回,其他抛异常
        ////
        public static WxPayData CloseOrder(WxPayData inputObj, int timeOut = 6)
        {
            string url = "https://api.mch.weixin.qq.com/pay/closeorder";
            //检测必填参数
            if (!inputObj.IsSet("out_trade_no"))
            {
                throw new WxPayException("关闭订单接口中,out_trade_no必填!");
            }

            inputObj.SetValue("appid", WxPayConfig.APPID);//公众账号ID
            inputObj.SetValue("mch_id", WxPayConfig.MCHID);//商户号
            inputObj.SetValue("nonce_str", GenerateNonceStr());//随机字符串
            inputObj.SetValue("sign", inputObj.MakeSign());//签名
            string xml = inputObj.ToXml();

            var start = DateTime.Now;//请求开始时间

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

            var end = DateTime.Now;
            int timeCost = (int)((end - start).TotalMilliseconds);

            WxPayData result = new WxPayData();
            result.FromXml(response);

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

            return result;
        }
Example #2
0
        /// 下载对账单
        /// @param WxPayData inputObj 提交给下载对账单API的参数
        /// @param int timeOut 接口超时时间
        /// @throws WxPayException
        /// @return 成功时返回,其他抛异常
        public static WxPayData DownloadBill(WxPayData inputObj, int timeOut = 6)
        {
            string url = "https://api.mch.weixin.qq.com/pay/downloadbill";
            //检测必填参数
            if (!inputObj.IsSet("bill_date"))
            {
                throw new WxPayException("对账单接口中,缺少必填参数bill_date!");
            }

            inputObj.SetValue("appid", WxPayConfig.APPID);//公众账号ID
            inputObj.SetValue("mch_id", WxPayConfig.MCHID);//商户号
            inputObj.SetValue("nonce_str", GenerateNonceStr());//随机字符串
            inputObj.SetValue("sign", inputObj.MakeSign());//签名

            string xml = inputObj.ToXml();

            //Log.Debug("WxPayApi", "DownloadBill request : " + xml);
            string response = HttpService.Post(xml, url, false, timeOut);//调用HTTP通信接口以提交数据到API
            //Log.Debug("WxPayApi", "DownloadBill result : " + response);

            WxPayData result = new WxPayData();
            //若接口调用失败会返回xml格式的结果
            if (response.Substring(0, 5) == "<xml>")
            {
                result.FromXml(response);
            }
            //接口调用成功则返回非xml格式的数据
            else
                result.SetValue("result", response);

            return result;
        }
Example #3
0
        public void WxNotify()
        {
            lock (_obj)
            {
                LogHelper.CreateLog("进入回调方法\r\n\r\n", "wxdebug");
                Notify notify = new Notify(this);
                WxPayData notifyData = notify.GetNotifyData();
                LogHelper.CreateLog(string.Format("notifyData:{0}", notifyData.ToJson()), "wxdebug");

                //检查支付结果中transaction_id是否存在
                if (!notifyData.IsSet("transaction_id"))
                {
                    //若transaction_id不存在,则立即返回结果给微信支付后台
                    WxPayData res = new WxPayData();
                    res.SetValue("return_code", "FAIL");
                    res.SetValue("return_msg", "支付结果中微信订单号不存在");
                    LogHelper.CreateLog(res.ToXml(), "wxdebug");
                }

                string transactionId = notifyData.GetValue("transaction_id").ToString();
                var orderId = notifyData.GetValue("out_trade_no").ToString();

                //由于微信会多次发出返回提示,所以需要判断下数据是否已经处理
                if (!UpdatePayStatus.CheckIsUpdate(orderId))
                {
                    //查询订单,判断订单真实性
                    if (!notify.QueryOrder(transactionId))
                    {
                        //若订单查询失败,则立即返回结果给微信支付后台
                        WxPayData res = new WxPayData();
                        res.SetValue("return_code", "FAIL");
                        res.SetValue("return_msg", "订单查询失败");
                        LogHelper.CreateLog(transactionId + Environment.NewLine + res.ToXml(), "wxdebug");
                    }
                    //查询订单成功
                    else
                    {
                        notifyData.SetValue("is_subscribe", "Y");
                        UpdatePayStatus.WxUpdate(orderId, _totalFee);
                        WxPayData res = new WxPayData();
                        res.SetValue("return_code", "SUCCESS");
                        res.SetValue("return_msg", "OK");
                        LogHelper.CreateLog(
                            "微信支付订单Success" + Environment.NewLine + transactionId + Environment.NewLine + res.ToXml(),
                            "wxdebug");

                    }
                }
            }
        }
Example #4
0
 //查询订单
 public bool QueryOrder(string transaction_id)
 {
     WxPayData req = new WxPayData();
     req.SetValue("transaction_id", transaction_id);
     WxPayData res = WxPayApi.OrderQuery(req);
     if (res.GetValue("return_code").ToString() == "SUCCESS" &&
         res.GetValue("result_code").ToString() == "SUCCESS")
     {
         return true;
     }
     else
     {
         return false;
     }
 }
Example #5
0
        /// <summary>
        /// 接收从微信支付后台发送过来的数据并验证签名
        /// </summary>
        /// <returns>微信支付后台返回的数据</returns>
        public WxPayData GetNotifyData()
        {
            //接收从微信后台POST过来的数据
            System.IO.Stream s = Controller.Request.InputStream;
            int count = 0;
            byte[] buffer = new byte[1024];
            StringBuilder builder = new StringBuilder();
            while ((count = s.Read(buffer, 0, 1024)) > 0)
            {
                builder.Append(Encoding.UTF8.GetString(buffer, 0, count));
            }
            s.Flush();
            s.Close();
            s.Dispose();

            //Log.Info(this.GetType().ToString(), "Receive data from WeChat : " + builder.ToString());

            //转换数据格式并验证签名
            WxPayData data = new WxPayData();
            try
            {
                data.FromXml(builder.ToString());
            }
            catch (WxPayException ex)
            {
                //若签名错误,则立即返回结果给微信支付后台
                WxPayData res = new WxPayData();
                res.SetValue("return_code", "FAIL");
                res.SetValue("return_msg", ex.Message);
                //Log.Error(this.GetType().ToString(), "Sign check error : " + res.ToXml());
                Controller.Response.Write(res.ToXml());
                Controller.Response.End();
            }

            //Log.Info(this.GetType().ToString(), "Check sign success");
            return data;
        }
Example #6
0
        /// 下载对账单
        /// @param WxPayData inputObj 提交给下载对账单API的参数
        /// @param int timeOut 接口超时时间
        /// @throws WxPayException
        /// @return 成功时返回,其他抛异常
        public static WxPayData DownloadBill(WxPayData inputObj, int timeOut = 6)
        {
            string url = "https://api.mch.weixin.qq.com/pay/downloadbill";

            //检测必填参数
            if (!inputObj.IsSet("bill_date"))
            {
                throw new WxPayException("对账单接口中,缺少必填参数bill_date!");
            }

            inputObj.SetValue("appid", WxPayConfig.APPID);      //公众账号ID
            inputObj.SetValue("mch_id", WxPayConfig.MCHID);     //商户号
            inputObj.SetValue("nonce_str", GenerateNonceStr()); //随机字符串
            inputObj.SetValue("sign", inputObj.MakeSign());     //签名

            string xml = inputObj.ToXml();

            //Log.Debug("WxPayApi", "DownloadBill request : " + xml);
            string response = HttpService.Post(xml, url, false, timeOut);//调用HTTP通信接口以提交数据到API
            //Log.Debug("WxPayApi", "DownloadBill result : " + response);

            WxPayData result = new WxPayData();

            //若接口调用失败会返回xml格式的结果
            if (response.Substring(0, 5) == "<xml>")
            {
                result.FromXml(response);
            }
            //接口调用成功则返回非xml格式的数据
            else
            {
                result.SetValue("result", response);
            }

            return(result);
        }
Example #7
0
        /// 查询退款
        /// 提交退款申请后,通过该接口查询退款状态。退款有一定延时,
        /// 用零钱支付的退款20分钟内到账,银行卡支付的退款3个工作日后重新查询退款状态。
        /// out_refund_no、out_trade_no、transaction_id、refund_id四个参数必填一个
        /// @param WxPayData inputObj 提交给查询退款API的参数
        /// @param int timeOut 接口超时时间
        /// @throws WxPayException
        /// @return 成功时返回,其他抛异常
        public static WxPayData RefundQuery(WxPayData inputObj, int timeOut = 6)
        {
            string url = "https://api.mch.weixin.qq.com/pay/refundquery";

            //检测必填参数
            if (!inputObj.IsSet("out_refund_no") && !inputObj.IsSet("out_trade_no") &&
                !inputObj.IsSet("transaction_id") && !inputObj.IsSet("refund_id"))
            {
                throw new WxPayException("退款查询接口中,out_refund_no、out_trade_no、transaction_id、refund_id四个参数必填一个!");
            }

            inputObj.SetValue("appid", WxPayConfig.APPID);      //公众账号ID
            inputObj.SetValue("mch_id", WxPayConfig.MCHID);     //商户号
            inputObj.SetValue("nonce_str", GenerateNonceStr()); //随机字符串
            inputObj.SetValue("sign", inputObj.MakeSign());     //签名

            string xml = inputObj.ToXml();

            var start = DateTime.Now;//请求开始时间

            //Log.Debug("WxPayApi", "RefundQuery request : " + xml);
            string response = HttpService.Post(xml, url, false, timeOut);//调用HTTP通信接口以提交数据到API
            //Log.Debug("WxPayApi", "RefundQuery response : " + response);

            var end      = DateTime.Now;
            int timeCost = (int)((end - start).TotalMilliseconds);//获得接口耗时

            //将xml格式的结果转换为对象以返回
            WxPayData result = new WxPayData();

            result.FromXml(response);

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

            return(result);
        }
Example #8
0
        /// <summary>
        /// 统一下单
        /// </summary>
        /// <param name="wxPayData">提交给统一下单API的参数</param>
        /// <param name="timeOut">超时时间</param>
        /// <returns>成功时返回,其他抛异常</returns>
        public static WxPayData UnifiedOrder(WxPayData wxPayData, int timeOut = 6)
        {
            string url = "https://api.mch.weixin.qq.com/pay/unifiedorder";
            //检测必填参数
            if (!wxPayData.IsSet("out_trade_no"))
            {
                throw new WxPayException("缺少统一支付接口必填参数out_trade_no!");
            }
            else if (!wxPayData.IsSet("body"))
            {
                throw new WxPayException("缺少统一支付接口必填参数body!");
            }
            else if (!wxPayData.IsSet("total_fee"))
            {
                throw new WxPayException("缺少统一支付接口必填参数total_fee!");
            }
            else if (!wxPayData.IsSet("trade_type"))
            {
                throw new WxPayException("缺少统一支付接口必填参数trade_type!");
            }

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

            //异步通知url未设置,则使用配置文件中的url
            if (!wxPayData.IsSet("notify_url"))
            {
                var notifyurl = "http://" + HttpContext.Current.Request.Url.Authority + WxPayConfig.NOTIFY_URL;
                wxPayData.SetValue("notify_url", notifyurl);//异步通知url
            }

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

            LogHelper.CreateLog(string.Format("WxPayApi.UnifiedOrder:{0}", wxPayData.ToJson()), "wxdebug");
            //签名
            wxPayData.SetValue("sign", wxPayData.MakeSign());
            string xml = wxPayData.ToXml();

            var start = DateTime.Now;

            LogHelper.CreateLog(string.Format("WxPayApi.UnifiedOrder   UnfiedOrder request:{0}", xml), "wxdebug");
            string response = HttpService.Post(xml, url, false, timeOut);
            LogHelper.CreateLog(string.Format("WxPayApi.UnifiedOrder   UnfiedOrder response:{0}", xml), "wxdebug");

            var end = DateTime.Now;
            int timeCost = (int)((end - start).TotalMilliseconds);

            WxPayData result = new WxPayData();
            //将返回的数据转化成wxPayData
            result.FromXml(response);

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

            return result;
        }
Example #9
0
        /// 转换短链接
        /// 该接口主要用于扫码原生支付模式一中的二维码链接转成短链接(weixin://wxpay/s/XXXXXX),
        /// 减小二维码数据量,提升扫描速度和精确度。
        /// @param WxPayData inputObj 提交给转换短连接API的参数
        /// @param int timeOut 接口超时时间
        /// @throws WxPayException
        /// @return 成功时返回,其他抛异常
        public static WxPayData ShortUrl(WxPayData inputObj, int timeOut = 6)
        {
            string url = "https://api.mch.weixin.qq.com/tools/shorturl";
            //检测必填参数
            if (!inputObj.IsSet("long_url"))
            {
                throw new WxPayException("需要转换的URL,签名用原串,传输需URL encode!");
            }

            inputObj.SetValue("appid", WxPayConfig.APPID);//公众账号ID
            inputObj.SetValue("mch_id", WxPayConfig.MCHID);//商户号
            inputObj.SetValue("nonce_str", GenerateNonceStr());//随机字符串
            inputObj.SetValue("sign", inputObj.MakeSign());//签名
            string xml = inputObj.ToXml();

            var start = DateTime.Now;//请求开始时间

            //Log.Debug("WxPayApi", "ShortUrl request : " + xml);
            string response = HttpService.Post(xml, url, false, timeOut);
            //Log.Debug("WxPayApi", "ShortUrl response : " + response);

            var end = DateTime.Now;
            int timeCost = (int)((end - start).TotalMilliseconds);

            WxPayData result = new WxPayData();
            result.FromXml(response);
            ReportCostTime(url, timeCost, result);//测速上报

            return result;
        }
Example #10
0
        ///////
        ///
        /// 撤销订单API接口
        /// @param WxPayData inputObj 提交给撤销订单API接口的参数,out_trade_no和transaction_id必填一个
        /// @param int timeOut 接口超时时间
        /// @throws WxPayException
        /// @return 成功时返回API调用结果,其他抛异常
        ////
        public static WxPayData Reverse(WxPayData inputObj, int timeOut = 6)
        {
            string url = "https://api.mch.weixin.qq.com/secapi/pay/reverse";
            //检测必填参数
            if (!inputObj.IsSet("out_trade_no") && !inputObj.IsSet("transaction_id"))
            {
                throw new WxPayException("撤销订单API接口中,参数out_trade_no和transaction_id必须填写一个!");
            }

            inputObj.SetValue("appid", WxPayConfig.APPID);//公众账号ID
            inputObj.SetValue("mch_id", WxPayConfig.MCHID);//商户号
            inputObj.SetValue("nonce_str", GenerateNonceStr());//随机字符串
            inputObj.SetValue("sign", inputObj.MakeSign());//签名
            string xml = inputObj.ToXml();

            var start = DateTime.Now;//请求开始时间

            //Log.Debug("WxPayApi", "Reverse request : " + xml);

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

            //Log.Debug("WxPayApi", "Reverse response : " + response);

            var end = DateTime.Now;
            int timeCost = (int)((end - start).TotalMilliseconds);

            WxPayData result = new WxPayData();
            result.FromXml(response);

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

            return result;
        }
Example #11
0
        ///////
        ///
        /// 测速上报接口实现
        /// @param WxPayData inputObj 提交给测速上报接口的参数
        /// @param int timeOut 测速上报接口超时时间
        /// @throws WxPayException
        /// @return 成功时返回测速上报接口返回的结果,其他抛异常
        ////
        public static WxPayData Report(WxPayData inputObj, int timeOut = 1)
        {
            string url = "https://api.mch.weixin.qq.com/payitil/report";
            //检测必填参数
            if (!inputObj.IsSet("interface_url"))
            {
                throw new WxPayException("接口URL,缺少必填参数interface_url!");
            }
            if (!inputObj.IsSet("return_code"))
            {
                throw new WxPayException("返回状态码,缺少必填参数return_code!");
            }
            if (!inputObj.IsSet("result_code"))
            {
                throw new WxPayException("业务结果,缺少必填参数result_code!");
            }
            if (!inputObj.IsSet("user_ip"))
            {
                throw new WxPayException("访问接口IP,缺少必填参数user_ip!");
            }
            if (!inputObj.IsSet("execute_time_"))
            {
                throw new WxPayException("接口耗时,缺少必填参数execute_time_!");
            }

            inputObj.SetValue("appid", WxPayConfig.APPID);//公众账号ID
            inputObj.SetValue("mch_id", WxPayConfig.MCHID);//商户号
            inputObj.SetValue("user_ip", WxPayConfig.IP);//终端ip
            inputObj.SetValue("time", DateTime.Now.ToString("yyyyMMddHHmmss"));//商户上报时间
            inputObj.SetValue("nonce_str", GenerateNonceStr());//随机字符串
            inputObj.SetValue("sign", inputObj.MakeSign());//签名
            string xml = inputObj.ToXml();

            //Log.Info("WxPayApi", "Report request : " + xml);

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

            //Log.Info("WxPayApi", "Report response : " + response);

            WxPayData result = new WxPayData();
            result.FromXml(response);
            return result;
        }
Example #12
0
        /// 查询退款
        /// 提交退款申请后,通过该接口查询退款状态。退款有一定延时,
        /// 用零钱支付的退款20分钟内到账,银行卡支付的退款3个工作日后重新查询退款状态。
        /// out_refund_no、out_trade_no、transaction_id、refund_id四个参数必填一个
        /// @param WxPayData inputObj 提交给查询退款API的参数
        /// @param int timeOut 接口超时时间
        /// @throws WxPayException
        /// @return 成功时返回,其他抛异常
        public static WxPayData RefundQuery(WxPayData inputObj, int timeOut = 6)
        {
            string url = "https://api.mch.weixin.qq.com/pay/refundquery";
            //检测必填参数
            if (!inputObj.IsSet("out_refund_no") && !inputObj.IsSet("out_trade_no") &&
                !inputObj.IsSet("transaction_id") && !inputObj.IsSet("refund_id"))
            {
                throw new WxPayException("退款查询接口中,out_refund_no、out_trade_no、transaction_id、refund_id四个参数必填一个!");
            }

            inputObj.SetValue("appid", WxPayConfig.APPID);//公众账号ID
            inputObj.SetValue("mch_id", WxPayConfig.MCHID);//商户号
            inputObj.SetValue("nonce_str", GenerateNonceStr());//随机字符串
            inputObj.SetValue("sign", inputObj.MakeSign());//签名

            string xml = inputObj.ToXml();

            var start = DateTime.Now;//请求开始时间

            //Log.Debug("WxPayApi", "RefundQuery request : " + xml);
            string response = HttpService.Post(xml, url, false, timeOut);//调用HTTP通信接口以提交数据到API
            //Log.Debug("WxPayApi", "RefundQuery response : " + response);

            var end = DateTime.Now;
            int timeCost = (int)((end - start).TotalMilliseconds);//获得接口耗时

            //将xml格式的结果转换为对象以返回
            WxPayData result = new WxPayData();
            result.FromXml(response);

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

            return result;
        }
Example #13
0
        /// 申请退款
        /// @param WxPayData inputObj 提交给申请退款API的参数
        /// @param int timeOut 超时时间
        /// @throws WxPayException
        /// @return 成功时返回接口调用结果,其他抛异常
        public static WxPayData Refund(WxPayData inputObj, int timeOut = 6)
        {
            string url = "https://api.mch.weixin.qq.com/secapi/pay/refund";
            //检测必填参数
            if (!inputObj.IsSet("out_trade_no") && !inputObj.IsSet("transaction_id"))
            {
                throw new WxPayException("退款申请接口中,out_trade_no、transaction_id至少填一个!");
            }
            else if (!inputObj.IsSet("out_refund_no"))
            {
                throw new WxPayException("退款申请接口中,缺少必填参数out_refund_no!");
            }
            else if (!inputObj.IsSet("total_fee"))
            {
                throw new WxPayException("退款申请接口中,缺少必填参数total_fee!");
            }
            else if (!inputObj.IsSet("refund_fee"))
            {
                throw new WxPayException("退款申请接口中,缺少必填参数refund_fee!");
            }
            else if (!inputObj.IsSet("op_user_id"))
            {
                throw new WxPayException("退款申请接口中,缺少必填参数op_user_id!");
            }

            inputObj.SetValue("appid", WxPayConfig.APPID);//公众账号ID
            inputObj.SetValue("mch_id", WxPayConfig.MCHID);//商户号
            inputObj.SetValue("nonce_str", Guid.NewGuid().ToString().Replace("-", ""));//随机字符串
            inputObj.SetValue("sign", inputObj.MakeSign());//签名

            string xml = inputObj.ToXml();
            var start = DateTime.Now;

            //Log.Debug("WxPayApi", "Refund request : " + xml);
            string response = HttpService.Post(xml, url, true, timeOut);//调用HTTP通信接口提交数据到API
            //Log.Debug("WxPayApi", "Refund response : " + response);

            var end = DateTime.Now;
            int timeCost = (int)((end - start).TotalMilliseconds);//获得接口耗时

            //将xml格式的结果转换为对象以返回
            WxPayData result = new WxPayData();
            result.FromXml(response);

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

            return result;
        }
Example #14
0
        private void GetOpenidAndAccessTokenFromCode(string code)
        {
            try
            {
                //构造获取openid及access_token的url
                WxPayData data = new WxPayData();
                data.SetValue("appid", WxPayConfig.APPID);
                data.SetValue("secret", WxPayConfig.APPSECRET);
                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);

                //保存access_token,用于收货地址获取
                JsonData jd = JsonMapper.ToObject(result);
                _accessToken = (string)jd["access_token"];

                //获取用户openid
                _openId = (string)jd["openid"];

                LogHelper.CreateLog(string.Format("WxPayController.GetOpenidAndAccessTokenFromCode     openid:{0}\r\naccess_token:{1}", _openId, _accessToken), "wxdebug");
            }
            catch (Exception ex)
            {
                LogHelper.WriteLog(ex, "~/logs/GeneralLog");
                throw new WxPayException(ex.ToString());
            }
        }
Example #15
0
        ///////
        /// 提交被扫支付API
        /// 收银员使用扫码设备读取微信用户刷卡授权码以后,二维码或条码信息传送至商户收银台,
        /// 由商户收银台或者商户后台调用该接口发起支付。
        /// @param WxPayData inputObj 提交给被扫支付API的参数
        /// @param int timeOut 超时时间
        /// @throws WxPayException
        /// @return 成功时返回调用结果,其他抛异常
        ////
        public static WxPayData Micropay(WxPayData inputObj, int timeOut = 10)
        {
            string url = "https://api.mch.weixin.qq.com/pay/micropay";
            //检测必填参数
            if (!inputObj.IsSet("body"))
            {
                throw new WxPayException("提交被扫支付API接口中,缺少必填参数body!");
            }
            else if (!inputObj.IsSet("out_trade_no"))
            {
                throw new WxPayException("提交被扫支付API接口中,缺少必填参数out_trade_no!");
            }
            else if (!inputObj.IsSet("total_fee"))
            {
                throw new WxPayException("提交被扫支付API接口中,缺少必填参数total_fee!");
            }
            else if (!inputObj.IsSet("auth_code"))
            {
                throw new WxPayException("提交被扫支付API接口中,缺少必填参数auth_code!");
            }

            inputObj.SetValue("spbill_create_ip", WxPayConfig.IP);//终端ip
            inputObj.SetValue("appid", WxPayConfig.APPID);//公众账号ID
            inputObj.SetValue("mch_id", WxPayConfig.MCHID);//商户号
            inputObj.SetValue("nonce_str", Guid.NewGuid().ToString().Replace("-", ""));//随机字符串
            inputObj.SetValue("sign", inputObj.MakeSign());//签名
            string xml = inputObj.ToXml();

            var start = DateTime.Now;//请求开始时间

            //Log.Debug("WxPayApi", "MicroPay request : " + xml);
            string response = HttpService.Post(xml, url, false, timeOut);//调用HTTP通信接口以提交数据到API
            //Log.Debug("WxPayApi", "MicroPay response : " + response);

            var end = DateTime.Now;
            int timeCost = (int)((end - start).TotalMilliseconds);//获得接口耗时

            //将xml格式的结果转换为对象以返回
            WxPayData result = new WxPayData();
            result.FromXml(response);

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

            return result;
        }
Example #16
0
        /**
        *
        * 从统一下单成功返回的数据中获取微信浏览器调起jsapi支付所需的参数,
        * 微信浏览器调起JSAPI时的输入参数格式如下:
        * {
        *   "appId" : "wx2421b1c4370ec43b",     //公众号名称,由商户传入
        *   "timeStamp":" 1395712654",         //时间戳,自1970年以来的秒数
        *   "nonceStr" : "e61463f8efa94090b1f366cccfbbb444", //随机串
        *   "package" : "prepay_id=u802345jgfjsdfgsdg888",
        *   "signType" : "MD5",         //微信签名方式:
        *   "paySign" : "70EA570631E4BB79628FBCA90534C63FF7FADD89" //微信签名
        * }
        * @return string 微信浏览器调起JSAPI时的输入参数,json格式可以直接做参数用
        * 更详细的说明请参考网页端调起支付API:http://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_7
        *
        */
        private string GetJsApiParameters()
        {
            //Log.Debug(this.GetType().ToString(), "JsApiPay::GetJsApiParam is processing...");

            WxPayData 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());

            string parameters = jsApiParam.ToJson();

            //Log.Debug(this.GetType().ToString(), "Get jsApiParam : " + parameters);
            return parameters;
        }
Example #17
0
        /// <summary>
        /// 统一下单
        /// </summary>
        /// <param name="wxPayData">提交给统一下单API的参数</param>
        /// <param name="timeOut">超时时间</param>
        /// <returns>成功时返回,其他抛异常</returns>
        public static WxPayData UnifiedOrder(WxPayData wxPayData, int timeOut = 6)
        {
            string url = "https://api.mch.weixin.qq.com/pay/unifiedorder";

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

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

            //异步通知url未设置,则使用配置文件中的url
            if (!wxPayData.IsSet("notify_url"))
            {
                var notifyurl = "http://" + HttpContext.Current.Request.Url.Authority + WxPayConfig.NOTIFY_URL;
                wxPayData.SetValue("notify_url", notifyurl);//异步通知url
            }

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

            LogHelper.CreateLog(string.Format("WxPayApi.UnifiedOrder:{0}", wxPayData.ToJson()), "wxdebug");
            //签名
            wxPayData.SetValue("sign", wxPayData.MakeSign());
            string xml = wxPayData.ToXml();

            var start = DateTime.Now;

            LogHelper.CreateLog(string.Format("WxPayApi.UnifiedOrder   UnfiedOrder request:{0}", xml), "wxdebug");
            string response = HttpService.Post(xml, url, false, timeOut);

            LogHelper.CreateLog(string.Format("WxPayApi.UnifiedOrder   UnfiedOrder response:{0}", xml), "wxdebug");

            var end      = DateTime.Now;
            int timeCost = (int)((end - start).TotalMilliseconds);

            WxPayData result = new WxPayData();

            //将返回的数据转化成wxPayData
            result.FromXml(response);

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

            return(result);
        }
Example #18
0
        public ActionResult WxPayIndex()
        {
            var shopcarViewModel = Session["Car"] as ShopCarViewModel;
            if (shopcarViewModel == null)
                return RedirectToAction("CheckInfoTicket", "Booking");

            _totalFee = Convert.ToInt32(shopcarViewModel.UserInfo.SumPrice * 100).ToString();
            LogHelper.CreateLog("进入WxPayIndex" + Request.QueryString["code"], "wxdebug");
            if (!string.IsNullOrEmpty(Request.QueryString["code"]))
            {
                Session["Car"] = null;
                var orderId = shopcarViewModel.OrderId;
                string code = Request.QueryString["code"];
                LogHelper.CreateLog(string.Format("WxPayController.WxPayIndex  code:{0}", code), "wxdebug");
                GetOpenidAndAccessTokenFromCode(code);
                var wxjsParam = PrePay(orderId);
                try
                {
                    PrePayModel prePayModel = JsonConvert.DeserializeObject<PrePayModel>(wxjsParam);
                    if (prePayModel != null)
                    {
                        //                        var wxJsApiParam = string.Format(@"timestamp:{0},nonceStr:'{1}',package:'{2}'
                        //                                    ,signType:'{3}',paySign:'{4}'", prePayModel.TimeStamp, prePayModel.NonceStr,
                        //                            prePayModel.PackAge,
                        //                            prePayModel.SignType, prePayModel.PaySign);
                        //                        LogHelper.CreateLog(wxJsApiParam, "wxdebug");

                        ViewData["timestamp2"] = prePayModel.TimeStamp;
                        ViewData["nonceStr2"] = prePayModel.NonceStr;
                        ViewData["package2"] = prePayModel.PackAge;
                        ViewData["signType2"] = prePayModel.SignType;
                        ViewData["paySign2"] = prePayModel.PaySign;
                    }
                }
                catch (Exception ex)
                {
                    LogHelper.CreateLog(ex.StackTrace, "wxdebug");
                }

                var wxConfigResult = Jssdk.GetWxConfigResult(WxPayConfig.APPID, WxPayConfig.APPSECRET, Request.Url.AbsoluteUri);
                ViewData["appid"] = wxConfigResult.appid;
                ViewData["timestamp"] = wxConfigResult.timestamp;
                ViewData["noncestr"] = wxConfigResult.noncestr;
                ViewData["signature"] = wxConfigResult.signature;
            }
            else
            {
                //构造网页授权获取code的URL
                string host = Request.Url.Host;
                string path = Request.Path;
                string redirect_uri = HttpUtility.UrlEncode("http://" + host + path);
                WxPayData 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");
                data.SetValue("showwxpaytitle", "1");
                string url = "https://open.weixin.qq.com/connect/oauth2/authorize?" + data.ToUrl();
                LogHelper.CreateLog(string.Format("WxPayController.WxPayIndex      Will Redirect to URL :{0} ", url), "wxdebug");
                try
                {
                    //触发微信返回code码
                    Response.Redirect(url);//Redirect函数会抛出ThreadAbortException异常,不用处理这个异常
                }
                catch (System.Threading.ThreadAbortException)
                {
                }
            }
            return View();
        }
Example #19
0
        ///////
        ///
        /// 测速上报
        /// @param string interface_url 接口URL
        /// @param int timeCost 接口耗时
        /// @param WxPayData inputObj参数数组
        ////
        private static void ReportCostTime(string interface_url, int timeCost, WxPayData inputObj)
        {
            //如果不需要进行上报
            if (WxPayConfig.REPORT_LEVENL == 0)
            {
                //return;
            }

            //如果仅失败上报
            if (WxPayConfig.REPORT_LEVENL == 1 && inputObj.IsSet("return_code") && inputObj.GetValue("return_code").ToString() == "SUCCESS" &&
             inputObj.IsSet("result_code") && inputObj.GetValue("result_code").ToString() == "SUCCESS")
            {
                return;
            }

            //上报逻辑
            WxPayData data = new WxPayData();
            data.SetValue("interface_url", interface_url);
            data.SetValue("execute_time_", timeCost);
            //返回状态码
            if (inputObj.IsSet("return_code"))
            {
                data.SetValue("return_code", inputObj.GetValue("return_code"));
            }
            //返回信息
            if (inputObj.IsSet("return_msg"))
            {
                data.SetValue("return_msg", inputObj.GetValue("return_msg"));
            }
            //业务结果
            if (inputObj.IsSet("result_code"))
            {
                data.SetValue("result_code", inputObj.GetValue("result_code"));
            }
            //错误代码
            if (inputObj.IsSet("err_code"))
            {
                data.SetValue("err_code", inputObj.GetValue("err_code"));
            }
            //错误代码描述
            if (inputObj.IsSet("err_code_des"))
            {
                data.SetValue("err_code_des", inputObj.GetValue("err_code_des"));
            }
            //商户订单号
            if (inputObj.IsSet("out_trade_no"))
            {
                data.SetValue("out_trade_no", inputObj.GetValue("out_trade_no"));
            }
            //设备号
            if (inputObj.IsSet("device_info"))
            {
                data.SetValue("device_info", inputObj.GetValue("device_info"));
            }

            try
            {
                Report(data);
            }
            catch (WxPayException)
            {
                //不做任何处理
            }
        }
Example #20
0
        /**
        *
        * 获取收货地址js函数入口参数,详情请参考收货地址共享接口:http://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_9
        * @return string 共享收货地址js函数需要的参数,json格式可以直接做参数使用
        */
        private string GetEditAddressParameters()
        {
            string parameter = "";
            try
            {
                string host = Request.Url.Host;
                string path = Request.Path;
                string queryString = Request.Url.Query;
                //这个地方要注意,参与签名的是网页授权获取用户信息时微信后台回传的完整url
                string url = "http://" + host + path + queryString;

                //构造需要用SHA1算法加密的数据
                WxPayData signData = new WxPayData();
                signData.SetValue("appid", WxPayConfig.APPID);
                signData.SetValue("url", url);
                signData.SetValue("timestamp", WxPayApi.GenerateTimeStamp());
                signData.SetValue("noncestr", WxPayApi.GenerateNonceStr());
                signData.SetValue("accesstoken", _accessToken);
                string param = signData.ToUrl();

                //Log.Debug(this.GetType().ToString(), "SHA1 encrypt param : " + param);
                //SHA1加密
                string addrSign = FormsAuthentication.HashPasswordForStoringInConfigFile(param, "SHA1");
                //Log.Debug(this.GetType().ToString(), "SHA1 encrypt result : " + addrSign);

                //获取收货地址js函数入口参数
                WxPayData afterData = new WxPayData();
                afterData.SetValue("appId", WxPayConfig.APPID);
                afterData.SetValue("scope", "jsapi_address");
                afterData.SetValue("signType", "sha1");
                afterData.SetValue("addrSign", addrSign);
                afterData.SetValue("timeStamp", signData.GetValue("timestamp"));
                afterData.SetValue("nonceStr", signData.GetValue("noncestr"));

                //转为json格式
                parameter = afterData.ToJson();
                //Log.Debug(this.GetType().ToString(), "Get EditAddressParam : " + parameter);
            }
            catch (Exception ex)
            {
                //Log.Error(this.GetType().ToString(), ex.ToString());
                throw new WxPayException(ex.ToString());
            }

            return parameter;
        }
Example #21
0
        ///////
        ///
        /// 测速上报
        /// @param string interface_url 接口URL
        /// @param int timeCost 接口耗时
        /// @param WxPayData inputObj参数数组
        ////
        private static void ReportCostTime(string interface_url, int timeCost, WxPayData inputObj)
        {
            //如果不需要进行上报
            if (WxPayConfig.REPORT_LEVENL == 0)
            {
                //return;
            }

            //如果仅失败上报
            if (WxPayConfig.REPORT_LEVENL == 1 && inputObj.IsSet("return_code") && inputObj.GetValue("return_code").ToString() == "SUCCESS" &&
                inputObj.IsSet("result_code") && inputObj.GetValue("result_code").ToString() == "SUCCESS")
            {
                return;
            }

            //上报逻辑
            WxPayData data = new WxPayData();

            data.SetValue("interface_url", interface_url);
            data.SetValue("execute_time_", timeCost);
            //返回状态码
            if (inputObj.IsSet("return_code"))
            {
                data.SetValue("return_code", inputObj.GetValue("return_code"));
            }
            //返回信息
            if (inputObj.IsSet("return_msg"))
            {
                data.SetValue("return_msg", inputObj.GetValue("return_msg"));
            }
            //业务结果
            if (inputObj.IsSet("result_code"))
            {
                data.SetValue("result_code", inputObj.GetValue("result_code"));
            }
            //错误代码
            if (inputObj.IsSet("err_code"))
            {
                data.SetValue("err_code", inputObj.GetValue("err_code"));
            }
            //错误代码描述
            if (inputObj.IsSet("err_code_des"))
            {
                data.SetValue("err_code_des", inputObj.GetValue("err_code_des"));
            }
            //商户订单号
            if (inputObj.IsSet("out_trade_no"))
            {
                data.SetValue("out_trade_no", inputObj.GetValue("out_trade_no"));
            }
            //设备号
            if (inputObj.IsSet("device_info"))
            {
                data.SetValue("device_info", inputObj.GetValue("device_info"));
            }

            try
            {
                Report(data);
            }
            catch (WxPayException)
            {
                //不做任何处理
            }
        }
Example #22
0
        /**
        * 调用统一下单,获得下单结果
        * @return 统一下单结果
        * @失败时抛异常WxPayException
        */
        private WxPayData GetUnifiedOrderResult(string orderId)
        {
            //统一下单
            WxPayData data = new WxPayData();
            data.SetValue("body", "test");
            data.SetValue("attach", orderId);
            data.SetValue("out_trade_no", orderId);
            data.SetValue("total_fee", _totalFee);
            data.SetValue("time_start", DateTime.Now.ToString("yyyyMMddHHmmss"));
            data.SetValue("time_expire", DateTime.Now.AddMinutes(10).ToString("yyyyMMddHHmmss"));
            data.SetValue("goods_tag", "test");
            data.SetValue("trade_type", "JSAPI");
            data.SetValue("openid", _openId);
            LogHelper.CreateLog(string.Format("WxPayController.GetUnifiedOrderResult     下单数据:{0}", data.ToJson()), "wxdebug");

            WxPayData result = WxPayApi.UnifiedOrder(data);
            if (!result.IsSet("appid") || !result.IsSet("prepay_id") || result.GetValue("prepay_id").ToString() == "")
            {
                //Log.Error(this.GetType().ToString(), "UnifiedOrder response error!");
                throw new WxPayException("UnifiedOrder response error!");
            }

            _unifiedOrderResult = result;
            return result;
        }