示例#1
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);
    }
示例#2
0
        /// <summary>
        /// 接收从微信支付后台发送过来的数据并验证签名
        /// </summary>
        /// <returns>微信支付后台返回的数据</returns>
        public WxPayData GetNotifyData()
        {
            //接收从微信后台POST过来的数据
            System.IO.Stream s = page.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());
                page.Response.Write(res.ToXml());
                page.Response.End();
            }

            Log.Info(this.GetType().ToString(), "Check sign success");
            return data;
        }
示例#3
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);
    }
        private WxPayData GetNotifyData(HttpRequestBase Request, HttpResponseBase Response)
        {
            //接收从微信后台POST过来的数据
            System.IO.Stream s = 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();

            //转换数据格式并验证签名
            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);
                ClassLoger.Error("WeChartPayCallBackController.GetNotifyData:Sign check error", res.ToXml());
                Response.Write(res.ToXml());
                Response.End();
            }
            return(data);
        }
示例#5
0
        /// <summary>
        /// 接收从微信支付后台发送过来的数据并验证签名
        /// </summary>
        /// <returns>微信支付后台返回的数据</returns>
        public WxPayData GetNotifyData()
        {
            //接收从微信后台POST过来的数据
            System.IO.Stream s = 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());
                return(res);
            }

            return(data);
        }
示例#6
0
        /// <summary>
        /// 查询签约关系
        /// </summary>
        /// <param name="contract_id"></param>
        /// <returns></returns>
        public bool QueryContract(string city, string contract_id, out string outxml)
        {
            WxPayData inputObj = new WxPayData(city);

            inputObj.SetValue("appid", WxPayConfig.APPID(city));
            inputObj.SetValue("mch_id", WxPayConfig.getMCHID(city));
            inputObj.SetValue("contract_id", contract_id);
            inputObj.SetValue("version", "1.0");
            inputObj.SetValue("sign", inputObj.MakeSign());
            string    url    = "https://api.mch.weixin.qq.com/papay/querycontract";
            string    xml    = inputObj.ToXml();
            string    result = HttpService.Post(xml, url, false, 10);
            WxPayData data   = new WxPayData();

            data.FromXml(result);
            outxml = result;
            bool isSign = false;

            if (data.IsSet("contract_state") && data.GetValue("contract_state").ToString() == "0")
            {
                isSign = true;
            }
            return(isSign);
        }
示例#7
0
        /**
         *
         * 查询订单
         * @param WxPayData inputObj 提交给查询订单API的参数
         * @param int timeOut 超时时间
         * @throws WxPayException
         * @return 成功时返回订单查询结果,其他抛异常
         */
        public static WxPayData OrderQuery(WxPayData inputObj, int timeOut = 6)
        {
            string url = "https://api.mch.weixin.qq.com/pay/orderquery";

            //检测必填参数
            if (!inputObj.IsSet("out_trade_no") && !inputObj.IsSet("transaction_id"))
            {
                throw new WxPayException("订单查询接口中,out_trade_no、transaction_id至少填一个!");
            }

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

            string xml = inputObj.ToXml();

            var start = DateTime.Now;

            ClassLoger.DEBUG("WxPayApi", "OrderQuery request : " + xml);
            string response = HttpService.Post(xml, url, false, timeOut);//调用HTTP通信接口提交数据

            ClassLoger.DEBUG("WxPayApi", "OrderQuery 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);
        }
示例#8
0
        public void ProcessRequest(HttpContext context)
        {
            System.IO.Stream s = context.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(), "从微信服务器收到数据 : " + builder.ToString());
            WxPayData data = new WxPayData();

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

            Log.Info(this.GetType().ToString(), "Check sign success");
            var money  = Convert.ToDouble(data.GetValue("total_fee").ToString());
            var model  = "record";
            var id     = data.GetValue("out_trade_no").ToString();
            var result = JObject.Parse(sysconf.toget(model, id));

            //判断订单状态为未处理,以及微信服务器返回的APPID是否正确
            if (Convert.ToInt32(result["status"]) == 0 && data.GetValue("appid").ToString() == WxPayAPI.WxPayConfig.APPID)
            {
                var list = new List <Object>();
                // 修改订单状态
                list.Add(new
                {
                    method = "PUT",
                    path   = "/mcm/api/record/" + result["id"],
                    body   = new
                    {
                        status = 1, //0-处理中, 1-已处理
                        from   = data.GetValue("openid").ToString()
                    }
                });
                // 增加商户账户余额
                string inc = "{\"$inc\":{\"balance\":" + money / 100.0 + "}}";
                list.Add(new
                {
                    method = "PUT",
                    path   = "/mcm/api/user/" + result["user"],
                    body   = JObject.Parse(inc)
                });
                var res = JArray.Parse(sysconf.tobatch(list));
                //打印结果
                //Log.Info(this.GetType().ToString(), res.ToString());
                var err = 0;
                for (var i = 0; i < res.Count; i++)
                {
                    if (res[i]["id"] == null)
                    {
                        err += 1;
                    }
                }

                if (err > 0)
                {
                    Log.Error(this.GetType().ToString(), "微信服务器端处理成功,本地服务器端处理失败");
                    // 写入系统日志
                    var log = new List <Object>();
                    log.Add(new
                    {
                        method = "POST",
                        path   = "/mcm/api/log",
                        body   = new
                        {
                            type   = 1, //0-成功,1-失败
                            title  = "微信充值处理失败",
                            money  = money / 100.0,
                            record = id
                        }
                    });
                    sysconf.tobatch(log);
                }
                else
                {
                    Log.Info(this.GetType().ToString(), "微信充值处理成功");
                    // 写入系统日志
                    var log = new List <Object>();
                    log.Add(new
                    {
                        method = "POST",
                        path   = "/mcm/api/log",
                        body   = new
                        {
                            type   = 0, //0-成功,1-失败
                            title  = "微信充值处理成功",
                            money  = money / 100.0,
                            record = id
                        }
                    });
                    sysconf.tobatch(log);
                    WxPayData wxres1 = new WxPayData();
                    wxres1.SetValue("return_code", "SUCCESS");
                    wxres1.SetValue("return_msg", "");
                    context.Response.Write(wxres1.ToXml());
                    context.Response.End();
                }
            }
        }
示例#9
0
        /// <summary>
        /// 微信付款到银行卡
        /// </summary>
        public static WxPayData DoWxBankTransfer(string bankAccountNo, string wechatRealName, string bankName, decimal transferAmount, string remark, string transferNo)
        {
            string url              = "https://api.mch.weixin.qq.com/mmpaysptrans/pay_bank";
            string enc_bank_no      = bankAccountNo;                 //银行卡卡号
            string enc_true_name    = wechatRealName;                //收款方用户名
            string bank_code        = bankName;                      //开户行
            int    amount           = (Int32)(transferAmount * 100); //付款金额
            string desc             = remark;                        //付款说明
            string partner_trade_no = transferNo;                    //订单编号

            //https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=24_4&index=5
            switch (bank_code)
            {
            case "工商银行": bank_code = "1002"; break;

            case "农业银行": bank_code = "1005"; break;

            case "中国银行": bank_code = "1026"; break;

            case "建设银行": bank_code = "1003"; break;

            case "招商银行": bank_code = "1001"; break;

            case "邮储银行": bank_code = "1066"; break;

            case "交通银行": bank_code = "1020"; break;

            case "浦发银行": bank_code = "1004"; break;

            case "民生银行": bank_code = "1006"; break;

            case "兴业银行": bank_code = "1009"; break;

            case "平安银行": bank_code = "1010"; break;

            case "中信银行": bank_code = "1021"; break;

            case "华夏银行": bank_code = "1025"; break;

            case "广发银行": bank_code = "1027"; break;

            case "北京银行": bank_code = "1032"; break;

            case "宁波银行": bank_code = "1056"; break;

            default: break;
            }
            int   timeOut = 10;
            WxRSA obj     = new WxRSA();

            obj.getkey();
            enc_bank_no   = WxRSA.EncryptCSharp(enc_bank_no, "UTF-8");
            enc_true_name = WxRSA.EncryptCSharp(enc_true_name, "UTF-8");

            WxPayData request = new WxPayData();

            request.SetValue("mch_id", WxPayConfig.MCHID);                             //商户号
            request.SetValue("partner_trade_no", partner_trade_no);                    //订单号
            request.SetValue("nonce_str", Guid.NewGuid().ToString().Replace("-", "")); // );//随机字符串
            request.SetValue("enc_bank_no", enc_bank_no);                              //银行卡卡号
            request.SetValue("enc_true_name", enc_true_name);                          //收款方用户名
            request.SetValue("bank_code", bank_code);                                  //开户行编码
            request.SetValue("amount", amount);                                        //付款金额
            request.SetValue("desc", desc);                                            //付款说明
            request.SetValue("sign", request.MakeSign());                              //签名
            string xml = request.ToXml();                                              //转换xml格式

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

            string response = HttpService.Post(xml, url, true, timeOut);               //调用HTTP通信接口以提交数据到API

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

            WxPayData result = new WxPayData();

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

            return(result);
        }
示例#10
0
        }                                            //支付成功跳转的地址
        protected void Page_Load(object sender, EventArgs e)
        {
            string  openid       = DTRequest.GetQueryString("openid");
            string  order_no     = DTRequest.GetQueryString("order_no");
            decimal order_amount = 9.28M;  //订单金额
            string  subject1     = "在线支付"; //订单备注1
            string  subject2     = "在线支付"; //订单备注2

            //检查参数是否正确
            if (string.IsNullOrEmpty(openid) || string.IsNullOrEmpty(order_no))
            {
                Response.Redirect(new Web.UI.BasePage().linkurl("error", "?msg=" + Utils.UrlEncode("对不起,获取OPENID参数有误!")));
                return;
            }


            //JSAPI支付预处理
            try
            {
                //统一下单
                string      sendUrl     = "https://api.mch.weixin.qq.com/pay/unifiedorder";
                JsApiConfig jsApiConfig = new JsApiConfig();
                WxPayData   data        = new WxPayData();
                data.SetValue("body", subject1);                                               //商品描述
                data.SetValue("detail", subject2);                                             //商品详情
                data.SetValue("out_trade_no", order_no);                                       //商户订单号
                data.SetValue("total_fee", (Convert.ToDouble(order_amount) * 100).ToString()); //订单总金额,以分为单位
                data.SetValue("trade_type", "JSAPI");                                          //交易类型
                data.SetValue("openid", openid);                                               //公众账号ID
                data.SetValue("appid", jsApiConfig.AppId);                                     //公众账号ID
                data.SetValue("mch_id", jsApiConfig.Partner);                                  //商户号
                data.SetValue("nonce_str", JsApiPay.GenerateNonceStr());                       //随机字符串
                data.SetValue("notify_url", jsApiConfig.Notify_url);                           //异步通知url
                data.SetValue("spbill_create_ip", DTRequest.GetIP());                          //终端IP
                data.SetValue("sign", data.MakeSign(jsApiConfig.Key));                         //签名
                string    xml       = data.ToXml();                                            //转换成XML
                var       startTime = DateTime.Now;                                            //开始时间
                string    response  = HttpService.Post(xml, sendUrl, false, 6);                //发送请求
                var       endTime   = DateTime.Now;                                            //结束时间
                int       timeCost  = (int)((endTime - startTime).TotalMilliseconds);          //计算所用时间
                WxPayData result    = new WxPayData();
                result.FromXml(response, jsApiConfig.Key);
                JsApiPay.ReportCostTime(sendUrl, timeCost, result);//测速上报
                LogHelper.WriteDebugLog("[pay]:" + result.ToString());
                //获取H5调起JS API参数
                WxPayData jsApiParam = new WxPayData();
                jsApiParam.SetValue("appId", result.GetValue("appid"));
                jsApiParam.SetValue("timeStamp", JsApiPay.GenerateTimeStamp());
                jsApiParam.SetValue("nonceStr", JsApiPay.GenerateNonceStr());
                jsApiParam.SetValue("package", "prepay_id=" + result.GetValue("prepay_id"));
                jsApiParam.SetValue("signType", "MD5");
                jsApiParam.SetValue("paySign", jsApiParam.MakeSign(jsApiConfig.Key));
                wxJsApiParam = jsApiParam.ToJson();

                LogHelper.WriteDebugLog("[ApiParam]:" + jsApiParam.ToJson());
                //支付成功后跳转的URL
                returnUrl = new Web.UI.BasePage().linkurl("payment", "?action=succeed&order_no=" + order_no);
                //Response.Redirect(returnUrl);
            }
            catch (Exception ex)
            {
                Response.Redirect(new Web.UI.BasePage().linkurl("error", "?msg=" + Utils.UrlEncode(ex.Message)));
                return;
            }
        }
示例#11
0
        protected void Page_Load(object sender, EventArgs e)
        {
            //读取站点配置信息
            Model.sysconfig sysConfig       = new BLL.sysconfig().loadConfig();
            int             site_payment_id = 0; //订单支付方式

            //=============================获得订单信息================================
            order_no = DTRequest.GetFormString("pay_order_no").ToUpper();
            decimal order_amount = DTRequest.GetFormDecimal("pay_order_amount", 0);
            string  user_name    = DTRequest.GetFormString("pay_user_name");
            string  subject      = DTRequest.GetFormString("pay_subject");

            //检查参数是否正确
            if (string.IsNullOrEmpty(order_no) || order_amount == 0)
            {
                Response.Redirect(new Web.UI.BasePage().linkurl("error", "?msg=" + Utils.UrlEncode("对不起,您提交的参数有误!")));
                return;
            }
            //===============================判断订单==================================
            if (order_no.StartsWith("R")) //R开头为在线充值订单
            {
                Model.user_recharge model = new BLL.user_recharge().GetModel(order_no);
                if (model == null)
                {
                    Response.Redirect(new Web.UI.BasePage().linkurl("error", "?msg=" + Utils.UrlEncode("对不起,您充值的订单号不存在或已删除!")));
                    return;
                }
                if (model.amount != order_amount)
                {
                    Response.Redirect(new Web.UI.BasePage().linkurl("error", "?msg=" + Utils.UrlEncode("对不起,您充值的订单金额与实际金额不一致!")));
                    return;
                }
                if (model.status == 1)
                {
                    Response.Redirect(new Web.UI.BasePage().linkurl("payment", "?action=succeed&order_no=" + order_no));
                    return;
                }
                site_payment_id = model.payment_id; //站点支付方式ID
            }
            else //B开头为商品订单
            {
                Model.orders model = new BLL.orders().GetModel(order_no);
                if (model == null)
                {
                    Response.Redirect(new Web.UI.BasePage().linkurl("error", "?msg=" + Utils.UrlEncode("对不起,您支付的订单号不存在或已删除!")));
                    return;
                }
                if (model.order_amount != order_amount)
                {
                    Response.Redirect(new Web.UI.BasePage().linkurl("error", "?msg=" + Utils.UrlEncode("对不起,您支付的订单金额与实际金额不一致!")));
                    return;
                }
                if (model.payment_status == 2)
                {
                    Response.Redirect(new Web.UI.BasePage().linkurl("payment", "?action=succeed&order_no=" + order_no));
                    return;
                }
                site_payment_id = model.payment_id; //站点支付方式ID
            }
            if (user_name != "")
            {
                user_name = "支付会员:" + user_name;
            }
            else
            {
                user_name = "匿名用户";
            }

            //===========================调用统一下单接口==============================
            string       sendUrl      = "https://api.mch.weixin.qq.com/pay/unifiedorder";
            NativeConfig nativeConfig = new NativeConfig(site_payment_id);
            WxPayData    data         = new WxPayData();

            data.SetValue("body", user_name);                                              //商品描述
            data.SetValue("detail", sysConfig.webname + "-" + subject);                    //商品详情
            data.SetValue("out_trade_no", order_no);                                       //商户订单号
            data.SetValue("total_fee", (Convert.ToDouble(order_amount) * 100).ToString()); //订单总金额,以分为单位
            data.SetValue("trade_type", "NATIVE");                                         //交易类型
            data.SetValue("product_id", order_no);                                         //商品ID
            data.SetValue("notify_url", nativeConfig.Notify_url);                          //异步通知url
            data.SetValue("spbill_create_ip", DTRequest.GetIP());                          //终端IP
            data.SetValue("appid", nativeConfig.AppId);                                    //公众账号ID
            data.SetValue("mch_id", nativeConfig.Partner);                                 //商户号
            data.SetValue("nonce_str", NativePay.GenerateNonceStr());                      //随机字符串
            data.SetValue("sign", data.MakeSign(nativeConfig.Key));                        //签名
            string    xml       = data.ToXml();                                            //转换成XML
            var       startTime = DateTime.Now;                                            //开始时间
            string    response  = HttpService.Post(xml, sendUrl, false, 6);                //发送请求
            var       endTime   = DateTime.Now;                                            //结束时间
            int       timeCost  = (int)((endTime - startTime).TotalMilliseconds);          //计算所用时间
            WxPayData result    = new WxPayData();

            result.FromXml(response, nativeConfig.Key);
            NativePay.ReportCostTime(site_payment_id, sendUrl, timeCost, result); //测速上报

            string codeUrl = result.GetValue("code_url").ToString();              //获得统一下单接口返回的二维码链接

            imgQRCode.ImageUrl = "qrcode.aspx?data=" + HttpUtility.UrlEncode(codeUrl);
            litText.Text       = order_amount.ToString("#0.00");
        }
示例#12
0
        public static Dictionary <string, string> APPWxPayUnifiedorder(string trade_no, string body, string total_fee, bool IsOrder = true, bool IsChongZhi = false)
        {
            string url        = "https://api.mch.weixin.qq.com/pay/unifiedorder";
            string wx_appid   = PaymentConfig.WeiXinConfig.MobileAppID;
            string wx_mch_id  = PaymentConfig.WeiXinConfig.MobileMCHID;
            string notify_url = string.Empty;

            if (IsChongZhi)
            {
                notify_url = WeixinConfig.app_chongzhi_notify_url;
            }
            else if (IsOrder)
            {
                notify_url = WeixinConfig.app_notify_url;
            }
            //统一下单
            WxPayData data = new WxPayData();

            data.SetValue("body", body);
            data.SetValue("attach", "test");
            data.SetValue("out_trade_no", trade_no);
            data.SetValue("total_fee", total_fee);
            data.SetValue("time_start", DateTime.Now.ToString("yyyyMMddHHmmss"));
            data.SetValue("time_expire", DateTime.Now.AddMinutes(10).ToString("yyyyMMddHHmmss"));
            data.SetValue("goods_tag", "yongyouapp");
            data.SetValue("trade_type", "APP");
            data.SetValue("notify_url", notify_url);                 //异步通知url
            data.SetValue("appid", wx_appid);                        //公众账号ID
            data.SetValue("mch_id", wx_mch_id);                      //商户号
            data.SetValue("spbill_create_ip", WxPayConfig.IP);       //终端ip
            data.SetValue("nonce_str", WxPayApi.GenerateNonceStr()); //随机字符串
            data.SetValue("sign", data.MakeAPPSign());

            string    xml      = data.ToXml();
            string    response = HttpService.Post(xml, url, false, 6);
            WxPayData result   = new WxPayData();

            result.FromXml(response);

            if (!result.IsSet("appid") || !result.IsSet("prepay_id") || result.GetValue("prepay_id").ToString() == "")
            {
                throw new Exception("UnifiedOrder response error!");
            }
            WxPayData appApiParam = new WxPayData();

            appApiParam.SetValue("appid", wx_appid);
            appApiParam.SetValue("partnerid", wx_mch_id);
            appApiParam.SetValue("prepayid", result.GetValue("prepay_id"));
            appApiParam.SetValue("package", "Sign=WXPay");
            appApiParam.SetValue("noncestr", WxPayApi.GenerateNonceStr());
            appApiParam.SetValue("timestamp", WxPayApi.GenerateTimeStamp());
            //appApiParam.SetValue("signType", "MD5");
            appApiParam.SetValue("sign", appApiParam.MakeAPPSign());
            //通信成功
            var res = new Dictionary <string, string>
            {
                { "appid", appApiParam.GetValue("appid").ToString() },
                { "partnerid", appApiParam.GetValue("partnerid").ToString() },
                { "prepayid", appApiParam.GetValue("prepayid").ToString() },
                { "package", appApiParam.GetValue("package").ToString() },
                { "noncestr", appApiParam.GetValue("noncestr").ToString() },
                { "timestamp", appApiParam.GetValue("timestamp").ToString() },
                { "sign", appApiParam.GetValue("sign").ToString() }
            };

            //在服务器上签名
            return(res);
        }
示例#13
0
        public void WxRefundNotify()
        {
            WxPayData res = new WxPayData();

            try
            {
                Notify    notify     = new Notify(this);
                WxPayData notifyData = notify.GetRefundNotifyData();
                if (!notifyData.IsSet("return_code") || notifyData.GetValue("return_code").ToString() != "SUCCESS")
                {
                    goto TheEnd;
                }

                // 回调通知成功,取得密文
                var reqCiphertext = notifyData.GetValue("req_info").ToString();
                // 解密
                var key       = MD5Helper.ToMd5Bit32(PayConfig.WxKey());
                var clearText = MD5Helper.AESDecrypt(reqCiphertext, key);

                //转换数据格式
                WxPayData reqCipherData = new WxPayData();
                try { reqCipherData.FromXml(clearText, false); }
                catch (WxPayException) { }

                var refundStatus   = reqCipherData.GetValue("refund_status").ToString();
                var otherRefundNum = reqCipherData.GetValue("out_refund_no").ToString();
                var refundNo       = reqCipherData.GetValue("out_trade_no").ToString();

                if (refundStatus.ToUpper() == "SUCCESS")
                {
                    // 修改订单状态
                    ResultModel <Bis_Record> result = new RecordService().ModifyOrderStatusRefund(refundNo, otherRefundNum);
                    if (result.status > 0)
                    {
                        if (result.data != null)
                        {
                            // 修改退款单状态
                            new RefundService().UpdateRefundStatus(result.data.RecordID, otherRefundNum, Order_Status.Refunded);
                            // 退款成功,修改订单状态成功之后
                            // 推送微信通知消息
                            SendMsgRefund(result.data);
                        }
                        res.SetValue("return_code", "SUCCESS");
                        res.SetValue("return_msg", "OK");
                        Response.Write(res.ToXml());
                        Response.End();
                        return;
                    }
                }

TheEnd:
                res.SetValue("return_code", "FAIL");
                res.SetValue("return_msg", "FAIL");
                Response.Write(res.ToXml());
                Response.End();
            }
            catch (Exception ex)
            {
                res.SetValue("return_code", "FAIL");
                res.SetValue("return_msg", "FAIL");
                Response.Write(res.ToXml());
                Response.End();
                MYLog.Error("退款回调", ex.ToString());
            }
        }
示例#14
0
        public PaymentCallback Notify(RenderContext context)
        {
            string postdata = context.Request.Body;

            var result = new PaymentCallback();

            if (context.Request.Method == "GET")
            {
                result.RawData = context.Request.RawRelativeUrl;
            }
            else
            {
                result.RawData = postdata;
            }


            WxPayData data = new WxPayData();

            try
            {
                data.FromXml(postdata);
            }
            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());
                // page.Response.Write(res.ToXml());
                // page.Response.End();
                result.CallbackResponse = new CallbackResponse()
                {
                    Content     = res.ToXml(),
                    ContentType = "Application/Xml"
                };
                return(result);
            }

            //  Log.Info(this.GetType().ToString(), "Check sign success");
            // return data;


            //检查支付结果中transaction_id是否存在
            if (!data.IsSet("transaction_id"))
            {
                //若transaction_id不存在,则立即返回结果给微信支付后台
                WxPayData res = new WxPayData();
                res.SetValue("return_code", "FAIL");
                res.SetValue("return_msg", "支付结果中微信订单号不存在");
                // Log.Error(this.GetType().ToString(), "The Pay result is error : " + res.ToXml());
                // page.Response.Write(res.ToXml());
                // page.Response.End();

                result.CallbackResponse = new CallbackResponse()
                {
                    Content     = res.ToXml(),
                    ContentType = "Application/Xml"
                };

                return(result);
            }

            var obj = data.GetValue("out_trade_no");

            Guid RequestId;

            if (obj == null || !System.Guid.TryParse(obj.ToString(), out RequestId))
            {
                WxPayData res = new WxPayData();
                res.SetValue("return_code", "FAIL");
                res.SetValue("return_msg", "订单查询失败");
                result.CallbackResponse = new CallbackResponse()
                {
                    Content     = res.ToXml(),
                    ContentType = "Application/Xml"
                };
                return(result);
            }
            else
            {
                WxPayData res = new WxPayData();
                res.SetValue("return_code", "SUCCESS");
                res.SetValue("return_msg", "OK");
                result.CallbackResponse = new CallbackResponse()
                {
                    Content     = res.ToXml(),
                    ContentType = "Application/Xml"
                };

                result.RequestId = RequestId;

                var objcode = data.GetValue("result_code");

                if (objcode != null)
                {
                    string code = objcode.ToString().ToUpper();
                    if (code == "SUCCESS")
                    {
                        result.Status = PaymentStatus.Paid;
                    }

                    if (code == "FAIL")
                    {
                        result.Status = PaymentStatus.Rejected;
                    }
                    //业务结果 result_code 是 String(16)	SUCCESS SUCCESS/ FAIL
                }

                return(result);
            }
        }
示例#15
0
        protected void btnSumit_Click(object sender, EventArgs e)
        {
            StringBuilder sb = new StringBuilder();

            sb.Append(@"
           select * from Finance where id= @ID
            ");
            SqlParam[] param = new SqlParam[] {
                new SqlParam("@ID", hdId.Value)
            };
            DataTable dt = DataFactory.SqlDataBase().GetDataTableBySQL(sb, param);

            if (dt != null && dt.Rows.Count > 0)
            {
                string adminHotelid = dt.Rows[0]["AdminHotelid"].ToString();
                int    hotelid      = CommonHelper.GetInt(dt.Rows[0]["HotelId"].ToString());

                string orderNum = dt.Rows[0]["Number"].ToString();
                string name     = dt.Rows[0]["Name"].ToString();
                string phone    = dt.Rows[0]["Phone"].ToString();
                string memberId = dt.Rows[0]["MemberId"].ToString();
                string openid   = dt.Rows[0]["openid"].ToString();


                int money = CommonHelper.GetInt(dt.Rows[0]["Monery"].ToString());//订单金额


                double cancel_money = CommonHelper.GetDouble(txtMoney.Text);//取消金额


                if (cancel_money > money)
                {
                    ShowMsgHelper.Alert_Error("操作失败,退回金额不能大于订单支付金额!");
                    return;
                }
                if (cancel_money > 0)//退回金额
                {
                    switch (hdPayType.Value)
                    {
                    case "1":    //到店支付

                        break;

                    case "2":    //积分兑换

                        break;

                    case "3":    //会员卡支付

                        break;

                    case "4":    //微信支付
                        #region ******** 微信原路退回 ********
                        try
                        {
                            string transaction_id = dt.Rows[0]["wxddh"].ToString();
                            if (transaction_id == "")
                            {
                                ShowMsgHelper.Alert_Error("操作失败,未找到微信支付单号!");
                                return;
                            }
                            string ssl_path = WxPayConfig.SSLCERT_PATH(adminHotelid, hotelid);
                            if (ssl_path == "")
                            {
                                ShowMsgHelper.Alert_Error("操作失败,请联系开发人员配置API证书!");
                                return;
                            }
                            //判断文件的存在
                            if (System.IO.File.Exists(HttpContext.Current.Server.MapPath("~" + ssl_path)))
                            {
                                //存在文件
                            }
                            else
                            {
                                ShowMsgHelper.Alert_Error("操作失败,API证书不存在!");
                                return;
                            }
                            string total_fee  = (money * 100).ToString();
                            string refund_fee = (cancel_money * 100).ToString();

                            string    result = Refund.Run(transaction_id, orderNum, total_fee, refund_fee, adminHotelid, hotelid);
                            WxPayData data   = new WxPayData();
                            data.FromXml(result);    //把XML转换成对象
                            string GetReturnCode = data.GetValue("return_code").ToString();
                            if (GetReturnCode == "SUCCESS")
                            {
                                string GetResultCode = data.GetValue("result_code").ToString();
                                if (GetResultCode == "SUCCESS")
                                {
                                    string refund_id = data.GetValue("refund_id").ToString();
                                    Dictionary <string, object> datas = new Dictionary <string, object>();
                                    datas.Add("transaction_id", data.GetValue("transaction_id")); //微信订单号
                                    datas.Add("out_trade_no", data.GetValue("out_trade_no"));     //商户订单号
                                    datas.Add("out_refund_no", data.GetValue("out_refund_no"));   //商户退款单号
                                    datas.Add("refund_id", data.GetValue("refund_id"));           //微信退款单号

                                    //财务记录
                                    int iVal = CommonClass.InsertFinance(orderNum, name, phone, cancel_money, 41, "充值退款", memberId, transaction_id, adminHotelid, hotelid, refund_id, openid);
                                    if (iVal > 0)
                                    {
                                        try
                                        {
                                            Hashtable hs = new Hashtable();
                                            hs["vipkh"]  = dt.Rows[0]["Phone"];
                                            hs["bmcode"] = "99";
                                            hs["yddh"]   = orderNum;
                                            hs["je"]     = CommonHelper.GetDouble(cancel_money);
                                            //hs["fhcs"] = "T";
                                            hs["OUT_fhcs"] = null;
                                            Hashtable rs = new Hashtable();
                                            DataFactory.SqlDataBase(adminHotelid).ExecuteByProcReturn("PROC_WXCZKK", hs, ref rs);
                                        }
                                        catch (Exception ex)
                                        {
                                        }
                                        CommonMethod.Base_Log("充值退款", "Reservation", "ID:" + hdId.Value, "退款金额:" + cancel_money + "," + txtReason.Text, "订单编号:" + orderNum);
                                    }
                                }
                                else
                                {
                                    //https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=9_4
                                    if (GetResultCode == "NOTENOUGH")    //余额不足
                                    {
                                        ShowMsgHelper.ShowScript("cancelTips()");
                                        return;
                                    }
                                    ShowMsgHelper.Alert_Error("操作失败," + data.GetValue("err_code_des") + "!");
                                    return;
                                }
                            }
                            else
                            {
                                ShowMsgHelper.Alert_Error("签名验证失败!");
                                return;
                            }
                        }
                        catch (Exception ex)
                        {
                            ShowMsgHelper.Alert_Error("操作错误,签名验证失败");
                            return;
                        }
                        #endregion
                        break;

                    default:
                        ShowMsgHelper.Alert_Error("操作失败!");
                        return;

                        break;
                    }
                }

                Hashtable ht = new Hashtable();
                //ht["CancelNumber"] = cancel_night;
                ht["CancelTime"] = DateTime.Now;
                //string qxtxt = cancel_night + "间夜";

                CommonMethod.Base_Log("充值退款", "Finance", "ID:" + hdId.Value, "退款原因:" + txtReason.Text, "订单编号:" + orderNum);
                //int val = DataFactory.SqlDataBase().UpdateByHashtable("Reservation", "id", hdId.Value, ht);
                //if (val > 0)
                //{
                ShowMsgHelper.OpenClose("退款成功!");
                //}
            }
        }
示例#16
0
        //private ILogger _logger;
        //public UnifiedOrderResponse UnifiedOrder(UnifiedOrderRequest request)
        //{

        //    //_logger = new LoggerFactory().SetCurrent(new Log4NetLoggerFactory("Wechat_Verify")).CreateLogger();
        //    UnifiedOrderResponse resp = new UnifiedOrderResponse();
        //    //统一下单
        //    try
        //    {
        //        //_logger.Debug("exPay:in");
        //        WxPayData data = new WxPayData();
        //        data.SetValue("body", request.Body);
        //        data.SetValue("attach", request.Attach);
        //        data.SetValue("out_trade_no", request.OutTradeNo);
        //        data.SetValue("total_fee", request.TotalFee);
        //        data.SetValue("time_start", DateTime.Now.ToString("yyyyMMddHHmmss"));
        //        data.SetValue("time_expire", DateTime.Now.AddMinutes(10).ToString("yyyyMMddHHmmss"));
        //        data.SetValue("goods_tag", request.GoodTag);
        //        data.SetValue("trade_type", request.TradeType);
        //        data.SetValue("openid", request.OpenId);


        //        data.SetValue("notify_url", request.NotifyUrl);//异步通知url
        //        data.SetValue("appid", WxPayConfig.APPID);//公众账号ID
        //        data.SetValue("mch_id", WxPayConfig.MCHID);//商户号
        //        data.SetValue("spbill_create_ip", WxPayConfig.IP);//终端ip
        //        data.SetValue("nonce_str", WxPayApi.GenerateNonceStr());//随机字符串

        //        //签名
        //        data.SetValue("sign", data.MakeSign());

        //        string xml = data.ToXml();
        //        LogHelp.WriteLog(DateTime.Now + "payInxml:" + xml);
        //        RestClient client = new RestClient("https://api.mch.weixin.qq.com/pay/unifiedorder");
        //        RestRequest req = new RestRequest(Method.POST);
        //        req.RequestFormat = DataFormat.Xml;
        //        req.AddParameter("text/xml", xml, ParameterType.RequestBody);

        //        var content = client.Execute(req).Content;
        //        LogHelp.WriteLog(DateTime.Now + "payIn:" + content);
        //        WxPayData result = new WxPayData();
        //        result.FromXml(content);


        //        if (!result.IsSet("appid") || !result.IsSet("prepay_id") || result.GetValue("prepay_id").ToString() == "")
        //        {
        //            resp.Success = false;

        //            if (result.IsSet("return_msg"))
        //            {
        //                resp.ErrMsg = (string)result.GetValue("return_msg");
        //            }

        //            return resp;
        //        }

        //        resp.Success = (string)result.GetValue("return_code") == "SUCCESS";
        //        if (!resp.Success)
        //        {
        //            resp.ErrMsg = (string)result.GetValue("return_msg");
        //            return resp;
        //        }
        //        else
        //            resp.ErrMsg = string.Empty;

        //        resp.AppId = (string)result.GetValue("appid");
        //        resp.MchId = (string)result.GetValue("mch_id");
        //        resp.NonceStr = (string)result.GetValue("nonce_str");
        //        resp.Sign = (string)result.GetValue("sign");
        //        resp.PrepayId = (string)result.GetValue("prepay_id");
        //        resp.TradeType = (string)result.GetValue("trade_type");
        //    }
        //    catch (Exception ex)
        //    {
        //        LogHelp.WriteLog(DateTime.Now + "UnifiedOrderError:" + ex.Message);
        //    }

        //    return resp;
        //}

        //public RefundOrderResponse RefundOrder(RefundOrderRequest request)
        //{
        //    RefundOrderResponse resp = new RefundOrderResponse();

        //    RestClient client = new RestClient("https://api.mch.weixin.qq.com/secapi/pay/refund");

        //    X509Certificate2[] certs = new X509Certificate2[] {
        //        new X509Certificate2(request.SSLCertRootPath + WxPayConfig.SSLCERT_PATH, WxPayConfig.SSLCERT_PASSWORD)
        //        };

        //    client.ClientCertificates = new X509CertificateCollection(certs);

        //    WxPayData data = new WxPayData();
        //    data.SetValue("transaction_id", request.TransactionId);
        //    data.SetValue("out_refund_no", request.OutRefundNo);
        //    data.SetValue("total_fee", request.TotalFee);
        //    data.SetValue("refund_fee", request.RefundFee);
        //    data.SetValue("op_user_id", WxPayConfig.MCHID);

        //    data.SetValue("appid", WxPayConfig.APPID);
        //    data.SetValue("mch_id", WxPayConfig.MCHID);
        //    data.SetValue("nonce_str", WxPayApi.GenerateNonceStr());
        //    data.SetValue("sign", data.MakeSign());

        //    string xml = data.ToXml();

        //    RestRequest req = new RestRequest(Method.POST);
        //    req.RequestFormat = DataFormat.Xml;
        //    req.AddParameter("text/xml", xml, ParameterType.RequestBody);

        //    var content = client.Execute(req).Content;

        //    WxPayData result = new WxPayData();
        //    result.FromXml(content);

        //    resp.Success = (string)result.GetValue("return_code") == "SUCCESS";
        //    if (!resp.Success)
        //    {
        //        resp.ErrCode = (string)result.GetValue("err_code");
        //        resp.ErrMsg = (string)result.GetValue("err_code_des");
        //        return resp;
        //    }
        //    else
        //    {
        //        resp.ErrCode = string.Empty;
        //        resp.ErrMsg = string.Empty;
        //    }


        //    resp.AppId = (string)result.GetValue("appid");
        //    resp.MchId = (string)result.GetValue("mch_id");

        //    resp.TransactionId = (string)result.GetValue("transaction_id");
        //    resp.OutTradeNo = (string)result.GetValue("out_trade_no");
        //    resp.OutRefundNo = (string)result.GetValue("out_refund_no");
        //    resp.RefundId = (string)result.GetValue("refund_id");
        //    resp.RefundChannel = (string)result.GetValue("refund_channel");
        //    resp.RefundFee = int.Parse((string)result.GetValue("refund_fee"));
        //    resp.TotalFee = int.Parse((string)result.GetValue("total_fee"));

        //    return resp;
        //}


        public 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!");
            }

            inputObj.SetValue("op_user_id", WxPayConfig.MCHID);
            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;

            LogHelp.WriteLog(DateTime.Now + "Refund request:" + xml);

            byte[]         data       = System.Text.Encoding.UTF8.GetBytes(xml);
            HttpWebRequest webrequest = (HttpWebRequest)WebRequest.Create(url);

            webrequest.Method        = "POST";
            webrequest.ContentType   = "application/x-www-form-urlencoded";
            webrequest.Timeout       = 6 * 1000;;
            webrequest.ContentLength = data.Length;

            //string path = "/cert/apiclient_cert.p12";
            X509Certificate2 cert = new X509Certificate2(WxPayConfig.SSLCERT_PATH, WxPayConfig.SSLCERT_PASSWORD);

            webrequest.ClientCertificates.Add(cert);

            webrequest.KeepAlive       = false;
            webrequest.ProtocolVersion = HttpVersion.Version10;
            Stream stream = webrequest.GetRequestStream();

            stream.Write(data, 0, data.Length);
            stream.Close();
            HttpWebResponse webresponse = (HttpWebResponse)webrequest.GetResponse();
            StreamReader    sr          = new StreamReader(webresponse.GetResponseStream(), Encoding.UTF8);
            string          response    = sr.ReadToEnd();

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

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

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

            result.FromXml(response);



            return(result);
        }
示例#17
0
        /// <summary>
        /// 微信支付回调
        /// </summary>
        /// <returns></returns>
        public string wx()
        {
            Stream s = System.Web.HttpContext.Current.Request.InputStream;

            byte[] b = new byte[s.Length];
            s.Read(b, 0, (int)s.Length);
            string postStr = Encoding.UTF8.GetString(b);

            //解析xml
            WxPayData notifyData = new WxPayData();

            try
            {
                notifyData.FromXml(postStr);
            }
            catch (WxPayException ex)
            {
                WxPayData res = new WxPayData();
                res.SetValue("return_code", "FAIL");
                res.SetValue("return_msg", ex.Message);
                return(res.ToXml());
            }

            //检查xml数据
            if (!notifyData.IsSet("transaction_id") || !notifyData.IsSet("total_fee") || !notifyData.IsSet("out_trade_no"))
            {
                WxPayData res = new WxPayData();
                res.SetValue("return_code", "FAIL");
                res.SetValue("return_msg", "缺少参数");
                return(res.ToXml());
            }

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

            int total_fee = Convert.ToInt32(notifyData.GetValue("total_fee"));

            //保存日志文件
            System.IO.File.WriteAllText(Server.MapPath($"~/wxpaylog/{out_trade_no}.txt"), postStr);


            //查询订单,判断订单真实性
            if (!QueryOrder(transaction_id))
            {
                //若订单查询失败,则立即返回结果给微信支付后台
                WxPayData res = new WxPayData();
                res.SetValue("return_code", "FAIL");
                res.SetValue("return_msg", "订单查询失败");
                return(res.ToXml());
            }

            //执行存储过程-发货
            using (shhouseEntities ent = new shhouseEntities())
            {
                try
                {
                    ObjectParameter payresult = new ObjectParameter("payresult", typeof(int));
                    ObjectParameter state     = new ObjectParameter("state", typeof(int));
                    ObjectParameter msg       = new ObjectParameter("msg", typeof(string));

                    ent.order_pay_jjr2018(out_trade_no, 2, total_fee, payresult, state, msg);

                    int _state = (int)state.Value;
                    if (_state == 1)
                    {
                        WxPayData res = new WxPayData();
                        res.SetValue("return_code", "SUCCESS");
                        res.SetValue("return_msg", "OK");
                        return(res.ToXml());
                    }
                    else
                    {
                        WxPayData res = new WxPayData();
                        res.SetValue("return_code", "FAIL");
                        res.SetValue("return_msg", "订单处理失败");
                        return(res.ToXml());
                    }
                }
                catch (Exception e)
                {
                    WxPayData res = new WxPayData();
                    res.SetValue("return_code", "FAIL");
                    res.SetValue("return_msg", e.Message);
                    return(res.ToXml());
                }
            }
        }
示例#18
0
        // GET: PayCommon
        /// <summary>
        ///
        /// </summary>
        /// <returns></returns>
        public ActionResult Notify()
        {
            Edu.Tools.LogHelper.Info("开始执行微信回调");
            Response.ContentType = "text/plain";
            Response.Write("Hello World");


            string xmlData = getPostStr();//获取请求数据

            Edu.Tools.LogHelper.Info("微信回调数据" + xmlData);

            //转换数据格式并验证签名
            WxPayData data = new WxPayData();

            try
            {
                data.FromXml(xmlData);
            }
            catch (WxPayException ex)
            {
                //若签名错误,则立即返回结果给微信支付后台
                WxPayData ress = new WxPayData();
                ress.SetValue("return_code", "FAIL");
                ress.SetValue("return_msg", ex.Message);
            }

            Edu.Tools.LogHelper.Info("result_code:" + data.IsSet("result_code").ToString());
            //只有return_code为SUCCESS时才返回result_code
            if (data.IsSet("result_code"))
            {
                string transaction_id = data.GetValue("transaction_id").ToString();
                string out_trade_no   = data.GetValue("out_trade_no").ToString();
                string result_code    = data.GetValue("result_code").ToString();


                Edu.Tools.LogHelper.Info("out_trade_no:" + data.GetValue("out_trade_no").ToString());

                var order = unitOfWork.DOrder.Get(p => p.out_trade_no == out_trade_no).FirstOrDefault();


                Edu.Tools.LogHelper.Info("result_code:" + data.GetValue("result_code").ToString());
                if (result_code == "SUCCESS")
                {
                    Edu.Tools.LogHelper.Info("order:" + order.ID.ToString());
                    order.PayStatus = 1;
                }
                else
                {
                    Edu.Tools.LogHelper.Info("order:" + order.ID.ToString());
                    order.PayStatus = 2;
                }

                order.transaction_id = transaction_id;

                unitOfWork.DOrder.Update(order);
                OperationResult result = unitOfWork.Save();

                if (result.ResultType == OperationResultType.Success)
                {
                    Edu.Tools.LogHelper.Info("保存成功:" + order.ID.ToString());
                }
                else
                {
                    Edu.Tools.LogHelper.Info("保存失败:" + order.ID.ToString());
                }
            }

            //微信要求的回复格式
            WxPayData res = new WxPayData();

            res.SetValue("return_code", "SUCCESS");
            res.SetValue("return_msg", "OK");

            return(View());
        }
示例#19
0
        public async Task <WeChatNotifyRequest> WeChatNotify(Stream weChatReturnData)
        {
            //接收从微信后台POST过来的数据
            var s = weChatReturnData;
            int count;
            var buffer  = new byte[1024];
            var builder = new StringBuilder();

            while ((count = s.Read(buffer, 0, 1024)) > 0)
            {
                builder.Append(Encoding.UTF8.GetString(buffer, 0, count));
            }
            s.Flush();
            s.Dispose();
            var notifyData = new WxPayData();

            try
            {
                notifyData.FromXml(builder.ToString());
            }
            catch (Exception e)
            {
                var res = new WxPayData();
                res.SetValue("return_code", "FAIL");
                res.SetValue("return_msg", e.Message);
                return(new WeChatNotifyRequest {
                    IsVerify = false, PayNo = "", TradeIds = "", PayTime = "", Sign = "", Content = res.ToXml()
                });
            }

            //检查支付结果中transaction_id是否存在
            if (!notifyData.IsSet("transaction_id"))
            {
                //若transaction_id不存在,则立即返回结果给微信支付后台
                var res = new WxPayData();
                res.SetValue("return_code", "FAIL");
                res.SetValue("return_msg", "支付结果中微信订单号不存在");
                return(new WeChatNotifyRequest {
                    IsVerify = false, PayNo = "", TradeIds = "", PayTime = "", Sign = "", Content = res.ToXml()
                });
            }

            var transactionId = notifyData.GetValue("transaction_id").ToString();
            var tradeIds      = notifyData.GetValue("out_trade_no").ToString();
            var payTime       = notifyData.GetValue("time_end").ToString();

            //查询订单,判断订单真实性
            if (!await QueryOrder(transactionId))
            {
                //若订单查询失败,则立即返回结果给微信支付后台
                var res = new WxPayData();
                res.SetValue("return_code", "FAIL");
                res.SetValue("return_msg", "订单查询失败");
                return(new WeChatNotifyRequest {
                    IsVerify = false, PayNo = "", TradeIds = "", PayTime = "", Sign = "", Content = res.ToXml()
                });
            }
            //查询订单成功
            else
            {
                var res = new WxPayData();
                res.SetValue("return_code", "SUCCESS");
                res.SetValue("return_msg", "OK");
                return(new WeChatNotifyRequest {
                    IsVerify = true, PayNo = transactionId, TradeIds = tradeIds, PayTime = payTime, Sign = "", Content = res.ToXml()
                });
            }
        }
示例#20
0
        public ActionResult PayNotifyUrl()
        {
            try
            {
                //接收从微信后台POST过来的数据

                System.IO.Stream s    = HttpContext.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 res = new WxPayData();

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

                    return(Content(res.ToXml()));
                }

                //检查支付结果中transaction_id是否存在
                if (!data.IsSet("transaction_id"))
                {
                    //若transaction_id不存在,则立即返回结果给微信支付后台
                    res.SetValue("return_code", "FAIL");
                    res.SetValue("return_msg", "支付结果中微信订单号不存在");
                    //Log.Error(this.GetType().ToString(), "The Pay result is error : " + res.ToXml());
                    //page.Response.Write(res.ToXml());
                    //page.Response.End();
                    return(Content(res.ToXml()));
                }

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

                string attach = data.GetValue("attach").ToString();

                int id = int.Parse(attach);


                res.SetValue("return_code", "SUCCESS");
                res.SetValue("return_msg", "OK");
                return(Content(res.ToXml()));
            }
            catch (Exception ex)
            {
            }
            return(Content(""));
        }
示例#21
0
        public string ChargeByWeixin(string productName, decimal amount, string orderNo, string notifyUrl)
        {
            var config = ConfigInfo;

            WxPayConfig.APPID     = config.WeixinAppId;
            WxPayConfig.MCHID     = config.WeixinMchId;
            WxPayConfig.KEY       = config.WeixinKey;
            WxPayConfig.APPSECRET = config.WeixinAppSecret;

            //=======【支付结果通知url】=====================================

            /* 支付结果通知回调url,用于商户接收支付结果
             */
            WxPayConfig.NOTIFY_URL = notifyUrl;

            //=======【商户系统后台机器IP】=====================================

            /* 此参数可手动配置也可在程序中自动获取
             */
            WxPayConfig.IP = "8.8.8.8";


            //=======【代理服务器设置】===================================

            /* 默认IP和端口号分别为0.0.0.0和0,此时不开启代理(如有需要才设置)
             */
            WxPayConfig.PROXY_URL = "http://10.152.18.220:8080";

            //=======【上报信息配置】===================================

            /* 测速上报等级,0.关闭上报; 1.仅错误时上报; 2.全量上报
             */
            WxPayConfig.REPORT_LEVENL = 1;

            //=======【日志级别】===================================

            /* 日志等级,0.不输出日志;1.只输出错误信息; 2.输出错误和正常信息; 3.输出错误信息、正常信息和调试信息
             */
            WxPayConfig.LOG_LEVENL = 0;

            var data = new WxPayData();

            data.SetValue("body", productName);                                                   //商品描述
            data.SetValue("attach", string.Empty);                                                //附加数据
            data.SetValue("out_trade_no", WxPayApi.GenerateOutTradeNo());                         //随机字符串
            data.SetValue("total_fee", Convert.ToInt32(amount * 100));                            //总金额
            data.SetValue("time_start", DateTime.Now.ToString("yyyyMMddHHmmss"));                 //交易起始时间
            data.SetValue("time_expire", DateTime.Now.AddMinutes(10).ToString("yyyyMMddHHmmss")); //交易结束时间
            data.SetValue("goods_tag", "jjj");                                                    //商品标记
            data.SetValue("trade_type", "NATIVE");                                                //交易类型
            data.SetValue("product_id", "productId");                                             //商品ID

            string url = "https://api.mch.weixin.qq.com/pay/unifiedorder";

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

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

            //异步通知url未设置,则使用配置文件中的url
            if (!data.IsSet("notify_url"))
            {
                data.SetValue("notify_url", WxPayConfig.NOTIFY_URL);//异步通知url
            }

            data.SetValue("appid", WxPayConfig.APPID);                              //公众账号ID
            data.SetValue("mch_id", WxPayConfig.MCHID);                             //商户号
            data.SetValue("spbill_create_ip", WxPayConfig.IP);                      //终端ip
            data.SetValue("nonce_str", Guid.NewGuid().ToString().Replace("-", "")); //随机字符串

            //签名
            data.SetValue("sign", data.MakeSign());
            var xml      = data.ToXml();
            var response = HttpService.Post(xml, url, false, 6);
            var result   = new WxPayData();

            result.FromXml(response);

            Log.Info(GetType().ToString(), "ChargeByWeixin : " + response);
            Log.Info(GetType().ToString(), "notify_url : " + data.GetValue("notify_url"));

            if (!result.IsSet("code_url"))
            {
                throw new Exception($"code: {result.GetValue("return_code")}, msg: {result.GetValue("return_msg")}");
            }
            return(result.GetValue("code_url").ToString()); //获得统一下单接口返回的二维码链接
        }
示例#22
0
文件: Program.cs 项目: hkylin/WorkLog
        static void Main(string[] args)
        {
            log4net.Config.XmlConfigurator.ConfigureAndWatch(
                new FileInfo(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "log4net.config")));

            Console.WriteLine("请输入微信授权码:");
            string code = Console.ReadLine();

            Console.WriteLine("正在支付。。。。");

            CreateOrder createParam = new CreateOrder
            {
                auth_code = code.Trim(),
                //device_info = "test_device_id",
                device_info      = "hlgxczs",
                partner_id       = partner_id,
                nonce_str        = Guid.NewGuid().ToString().Replace("-", ""),
                total_fee        = "1",
                time_expire      = "5",
                no_rebate_money  = "0",
                spbill_create_ip = "127.0.0.1",
                operation_id     = "0"
            };

            var createResponeXml = CommonSDK.CommonSDK.CreateOrder(createParam, key, ltCreateOrderUrl);

            Log.InfoFormat("{0}", createResponeXml);
            Console.WriteLine();
            Console.WriteLine();
            Console.WriteLine(".......................下单返回......................");
            Console.WriteLine(string.Format("下单返回{0}", createResponeXml));
            Console.WriteLine(".......................执行查询......................");



            WxPayData responseData = new WxPayData();

            responseData.FromXml(createResponeXml, key);


            object shop_id     = string.Empty;  //窝窝门店ID
            object supplier_id = string.Empty;  //窝窝商户ID
            object order_id    = string.Empty;  //窝窝流水号

            shop_id     = responseData.GetValue("shop_id") ?? "";
            supplier_id = responseData.GetValue("supplier_id") ?? "";
            order_id    = responseData.GetValue("order_id") ?? "";

            QueryOrder queryParam = new QueryOrder
            {
                nonce_str   = Guid.NewGuid().ToString().Replace("-", ""),
                partner_id  = partner_id,
                shop_id     = shop_id.ToString(),
                supplier_id = supplier_id.ToString(),
                order_id    = order_id.ToString()
            };

            var queryResponeXml = CommonSDK.CommonSDK.QueryOrder(queryParam, key, ltQueryOrderUrl);

            Log.InfoFormat("查询返回{0}", queryResponeXml);
            Console.WriteLine();
            Console.WriteLine();
            Console.WriteLine(".......................查询返回......................");
            Console.WriteLine(string.Format("{0}", queryResponeXml));
            Console.ReadKey();
        }
示例#23
0
        public void NotifyByWeixin(HttpRequest request, out bool isPaied, out string responseXml)
        {
            isPaied = false;
            var config = ConfigInfo;

            WxPayConfig.APPID     = config.WeixinAppId;
            WxPayConfig.MCHID     = config.WeixinMchId;
            WxPayConfig.KEY       = config.WeixinKey;
            WxPayConfig.APPSECRET = config.WeixinAppSecret;

            //=======【商户系统后台机器IP】=====================================

            /* 此参数可手动配置也可在程序中自动获取
             */
            WxPayConfig.IP = "8.8.8.8";


            //=======【代理服务器设置】===================================

            /* 默认IP和端口号分别为0.0.0.0和0,此时不开启代理(如有需要才设置)
             */
            WxPayConfig.PROXY_URL = "http://10.152.18.220:8080";

            //=======【上报信息配置】===================================

            /* 测速上报等级,0.关闭上报; 1.仅错误时上报; 2.全量上报
             */
            WxPayConfig.REPORT_LEVENL = 1;

            //=======【日志级别】===================================

            /* 日志等级,0.不输出日志;1.只输出错误信息; 2.输出错误和正常信息; 3.输出错误信息、正常信息和调试信息
             */
            WxPayConfig.LOG_LEVENL = 0;

            //接收从微信后台POST过来的数据
            System.IO.Stream s = request.InputStream;
            int count;

            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(GetType().ToString(), "NotifyByWeixin : " + builder);

            //转换数据格式并验证签名
            WxPayData notifyData = new WxPayData();

            try
            {
                notifyData.FromXml(builder.ToString());
            }
            catch (WxPayException ex)
            {
                //若签名错误,则立即返回结果给微信支付后台
                WxPayData res = new WxPayData();
                res.SetValue("return_code", "FAIL");
                res.SetValue("return_msg", ex.Message);
                Log.Error(GetType().ToString(), "Sign check error : " + res.ToXml());
                responseXml = res.ToXml();
                return;
            }

            if (!notifyData.IsSet("return_code") || notifyData.GetValue("return_code").ToString() != "SUCCESS")
            {
                WxPayData res = new WxPayData();
                res.SetValue("return_code", "FAIL");
                res.SetValue("return_msg", "回调数据异常");
                Log.Info(GetType().ToString(), "The data WeChat post is error : " + res.ToXml());
                responseXml = res.ToXml();
                return;
            }

            //统一下单成功,则返回成功结果给微信支付后台
            WxPayData data = new WxPayData();

            data.SetValue("return_code", "SUCCESS");
            data.SetValue("return_msg", "OK");

            Log.Info(GetType().ToString(), "UnifiedOrder success , send data to WeChat : " + data.ToXml());
            isPaied     = true;
            responseXml = data.ToXml();
        }
示例#24
0
        public ActionResult WXNotify()
        {
            #region
            //接收从微信后台POST过来的数据
            System.IO.Stream s    = 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());
                Response.Write(res.ToXml());
                Response.End();
            }

            Log.Info(this.GetType().ToString(), "Check sign success");

            #endregion
            WriteLog("notify", "", data.ToXml() + "----" + data.GetValue("return_code"));
            try
            {
                ViewOrder order = new ViewOrder();
                if (data.GetValue("return_code").ToString() == ("SUCCESS"))
                {
                    order.Id = int.Parse(data.GetValue("attach").ToString());
                    OrderServiceClient osc = new OrderServiceClient();
                    order         = osc.Get(order.Id);
                    order.PayTime = DateTime.ParseExact(data.GetValue("time_end").ToString(), "yyyyMMddHHmmss", null);
                    order.IsPaid  = true;
                    order.Status  = 2;
                    order.OpenID  = data.GetValue("openid").ToString();
                    //osc.Edit(order);
                    osc.updateEntity(order);
                    data = new WxPayData();
                    data.SetValue("return_code", "SUCCESS");
                    data.SetValue("return_msg", "OK");
                    Response.Write(data.ToXml());
                    Response.End();
                    //Log.Error("成功", "");
                    //return RedirectToAction("viewactivity", "class", new { id = order.ClassId, isOrder = true }); //View();
                }
                else
                {
                    data = new WxPayData();
                    data.SetValue("return_code", "FAIL");
                    data.SetValue("return_msg", "FAIL");
                    Response.Write(data.ToXml());
                    Response.End();
                    //Log.Error("失败", "");
                    return(View());
                }
            }
            catch (Exception ex)
            {
                WriteLog("notify", "", ex.Message);
                //Log.Error("错误", "");
            }

            return(View());
        }
示例#25
0
        public PayNotify GetPayNotify(string xml)
        {
            DataTable dataTable = this.ErrorTable("Notify");
            DataRow   dataRow   = dataTable.NewRow();

            dataRow["OperTime"] = DateTime.Now;
            PayNotify result;

            try
            {
                if (string.IsNullOrEmpty(xml))
                {
                    dataRow["Error"] = "InStream Null";
                    dataRow["Param"] = "null";
                    dataTable.Rows.Add(dataRow);
                    this.WriteLog(dataTable);
                    result = null;
                }
                else
                {
                    PayNotify notifyObject = Utils.GetNotifyObject <PayNotify>(xml);
                    WxPayData wxPayData    = new WxPayData();
                    try
                    {
                        wxPayData.FromXml(xml, this._payAccount.PartnerKey);
                    }
                    catch (WxPayException ex)
                    {
                        Utils.WxPaylog("支付出错了:" + ex.Message, "_WxPaylog.txt");
                    }
                    SortedDictionary <string, object> values = wxPayData.GetValues();
                    if (notifyObject == null || values == null || values.Keys.Count == 0 || (values.ContainsKey("return_code") && values["return_code"].ToString() == "FAIL") || (values.ContainsKey("result_code") && values["result_code"].ToString() == "FAIL"))
                    {
                        Utils.WxPaylog(xml, "_WxPaylog.txt");
                        result = null;
                    }
                    else
                    {
                        notifyObject.PayInfo = new PayInfo
                        {
                            SignType      = "MD5",
                            Sign          = notifyObject.sign,
                            TradeMode     = 0,
                            BankType      = notifyObject.bank_type,
                            BankBillNo    = "",
                            TotalFee      = notifyObject.total_fee / 100m,
                            FeeType       = ((notifyObject.fee_type == "CNY") ? 1 : 0),
                            NotifyId      = "",
                            TransactionId = notifyObject.transaction_id,
                            OutTradeNo    = notifyObject.out_trade_no,
                            TransportFee  = 0m,
                            ProductFee    = 0m,
                            Discount      = 1m,
                            BuyerAlias    = ""
                        };
                        result = notifyObject;
                    }
                }
            }
            catch (Exception ex2)
            {
                dataRow["Error"] = ex2.Message;
                dataRow["Param"] = xml;
                dataTable.Rows.Add(dataRow);
                this.WriteLog(dataTable);
                result = null;
            }
            return(result);
        }
示例#26
0
        }                                            //支付成功跳转的地址
        protected void Page_Load(object sender, EventArgs e)
        {
            string  openid       = DTRequest.GetQueryString("openid");
            string  order_no     = DTRequest.GetQueryString("order_no");
            decimal order_amount = 0;            //订单金额
            string  subject1     = string.Empty; //订单备注1
            string  subject2     = string.Empty; //订单备注2

            //检查参数是否正确
            if (string.IsNullOrEmpty(openid) || string.IsNullOrEmpty(order_no))
            {
                Response.Redirect(new Web.UI.BasePage().linkurl("error", "?msg=" + Utils.UrlEncode("对不起,获取OPENID参数有误!")));
                return;
            }
            if (order_no.StartsWith("R")) //R开头为在线充值订单
            {
                Model.user_recharge model = new BLL.user_recharge().GetModel(order_no);
                if (model == null)
                {
                    Response.Redirect(new Web.UI.BasePage().linkurl("error", "?msg=" + Utils.UrlEncode("对不起,您充值的订单号不存在或已删除!")));
                    return;
                }
                order_amount = model.amount; //订单金额
                subject1     = "充值订单";
                subject2     = "用户名:" + model.user_name;
            }
            else //B开头为商品订单
            {
                Model.orders model = new BLL.orders().GetModel(order_no);
                if (model == null)
                {
                    Response.Redirect(new Web.UI.BasePage().linkurl("error", "?msg=" + Utils.UrlEncode("对不起,您支付的订单号不存在或已删除!")));
                    return;
                }
                order_amount = model.order_amount; //订单金额
                subject1     = "商品订单";
                if (model.user_id > 0)
                {
                    subject2 = "用户名:" + model.user_name;
                }
                else
                {
                    subject2 = "匿名用户";
                }
            }

            //JSAPI支付预处理
            try
            {
                //统一下单
                string      sendUrl     = "https://api.mch.weixin.qq.com/pay/unifiedorder";
                JsApiConfig jsApiConfig = new JsApiConfig();
                WxPayData   data        = new WxPayData();
                data.SetValue("body", subject1);                                               //商品描述
                data.SetValue("detail", subject2);                                             //商品详情
                data.SetValue("out_trade_no", order_no);                                       //商户订单号
                data.SetValue("total_fee", (Convert.ToDouble(order_amount) * 100).ToString()); //订单总金额,以分为单位
                data.SetValue("trade_type", "JSAPI");                                          //交易类型
                data.SetValue("openid", openid);                                               //公众账号ID
                data.SetValue("appid", jsApiConfig.AppId);                                     //公众账号ID
                data.SetValue("mch_id", jsApiConfig.Partner);                                  //商户号
                data.SetValue("nonce_str", JsApiPay.GenerateNonceStr());                       //随机字符串
                data.SetValue("notify_url", jsApiConfig.Notify_url);                           //异步通知url
                data.SetValue("spbill_create_ip", DTRequest.GetIP());                          //终端IP
                data.SetValue("sign", data.MakeSign(jsApiConfig.Key));                         //签名
                string    xml       = data.ToXml();                                            //转换成XML
                var       startTime = DateTime.Now;                                            //开始时间
                string    response  = HttpService.Post(xml, sendUrl, false, 6);                //发送请求
                var       endTime   = DateTime.Now;                                            //结束时间
                int       timeCost  = (int)((endTime - startTime).TotalMilliseconds);          //计算所用时间
                WxPayData result    = new WxPayData();
                result.FromXml(response, jsApiConfig.Key);
                JsApiPay.ReportCostTime(sendUrl, timeCost, result);//测速上报

                //获取H5调起JS API参数
                WxPayData jsApiParam = new WxPayData();
                jsApiParam.SetValue("appId", result.GetValue("appid"));
                jsApiParam.SetValue("timeStamp", JsApiPay.GenerateTimeStamp());
                jsApiParam.SetValue("nonceStr", JsApiPay.GenerateNonceStr());
                jsApiParam.SetValue("package", "prepay_id=" + result.GetValue("prepay_id"));
                jsApiParam.SetValue("signType", "MD5");
                jsApiParam.SetValue("paySign", jsApiParam.MakeSign(jsApiConfig.Key));
                wxJsApiParam = jsApiParam.ToJson();

                //支付成功后跳转的URL
                returnUrl = new Web.UI.BasePage().linkurl("payment", "?action=succeed&order_no=" + order_no);
            }
            catch (Exception ex)
            {
                Response.Redirect(new Web.UI.BasePage().linkurl("error", "?msg=" + Utils.UrlEncode("调用JSAPI下单失败,请检查微信授权目录是否已注册!")));
                return;
            }
        }
示例#27
0
        public ActionResult Callback(FormCollection form)
        {
            try
            {
                var processor = _paymentService.LoadPaymentMethodBySystemName("Payments.WeiXin") as WeiXinPaymentProcessor;
                if (processor == null ||
                    !processor.IsPaymentMethodActive(_paymentSettings) || !processor.PluginDescriptor.Installed)
                {
                    throw new NopException("Payments.WeiXin Not Found");
                }

                var s       = Request.InputStream;
                var count   = 0;
                var buffer  = new byte[1024];
                var 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();

                _logger.InsertLog(LogLevel.Information, GetType() + "Receive data from WeChat : " + builder);
                var data = new WxPayData();
                data.FromXml(builder.ToString(), _weiXinPaymentSettings.AppSecret);


                if (!data.IsSet("product_id"))
                {
                    var res = new WxPayData();
                    res.SetValue("return_code", "FAIL");
                    res.SetValue("return_msg", "支付结果中微信订单号不存在");
                    Response.Write(res.ToXml());
                    Response.End();
                }
                else if (!data.IsSet("appid") || !data.IsSet("appid") || !data.IsSet("appid") || !data.IsSet("appid") ||
                         !data.IsSet("appid") || !data.IsSet("appid"))
                {
                    var res = new WxPayData();
                    res.SetValue("return_code", "FAIL");
                    res.SetValue("return_msg", "缺少参数");
                    Response.Write(res.ToXml());
                    Response.End();
                }
                else
                {
                    var orderIdStr = data.GetValue("product_id").ToString();
                    int orderId;
                    if (!int.TryParse(orderIdStr, out orderId))
                    {
                        return(Content("error"));
                    }

                    var order = _orderService.GetOrderById(orderId);

                    if (order == null)
                    {
                        var res = new WxPayData();
                        res.SetValue("return_code", "FAIL");
                        res.SetValue("return_msg", "订单号错误");
                        Response.Write(res.ToXml());
                        Response.End();
                    }
                    else
                    {
                        var result = processor.Unifiedorder(orderIdStr, "宁尼可在线商城订单" + orderId, "宁尼可在线商城订单" + orderId, orderIdStr,
                                                            ((int)(order.OrderTotal * 100)).ToString(CultureInfo.InvariantCulture));

                        var wxModel = new WxPayData();
                        wxModel.FromXml(result, _weiXinPaymentSettings.AppSecret);

                        if (wxModel.IsSet("return_code") && (string)wxModel.GetValue("return_code") != "SUCCESS")
                        {
                            Response.Write(wxModel.ToXml());
                            Response.End();
                        }
                        else if (!wxModel.IsSet("prepay_id"))
                        {
                            var res = new WxPayData();
                            res.SetValue("return_code", "FAIL");
                            res.SetValue("return_msg", "预支付ID	不存在");
                            Response.Write(res.ToXml());
                            Response.End();
                        }
                        else
                        {
                            var res = new WxPayData();
                            res.SetValue("return_code", "SUCCESS");
                            res.SetValue("appid", _weiXinPaymentSettings.AppId);
                            res.SetValue("mch_id", _weiXinPaymentSettings.MchId);
                            res.SetValue("nonce_str", Guid.NewGuid().ToString("N"));
                            res.SetValue("prepay_id", wxModel.GetValue("prepay_id"));
                            res.SetValue("result_code", "SUCCESS");
                            var sign = res.MakeSign(_weiXinPaymentSettings.AppSecret);
                            res.SetValue("sign", sign);

                            Response.Write(res.ToXml());
                            Response.End();
                        }
                    }
                }
            }
            catch (NopException ex)
            {
                var res = new WxPayData();
                res.SetValue("return_code", "FAIL");
                res.SetValue("return_msg", ex.Message);

                Response.Write(res.ToXml());
                Response.End();
            }


            return(Content(""));
        }
示例#28
0
        /// <summary>
        /// 2-付款成功 1-未付款 3-异常
        /// </summary>
        /// <param name="out_trade_no"></param>
        /// <returns></returns>
        public static int OrderQuery(string out_trade_no)
        {
            var exist_payment = Foresight.DataAccess.Payment.GetPaymentByTradeNo(out_trade_no);

            if (exist_payment == null)
            {
                return(1);
            }
            if (string.IsNullOrEmpty(exist_payment.PaymentType))
            {
                return(1);
            }
            if (exist_payment.PaymentType.Equals(Utility.EnumModel.PaymentTypeDefine.wx.ToString()))
            {
                if (exist_payment.Status == 2)
                {
                    Web.APPCode.PaymentHelper.SaveRoomFee(out_trade_no, "微信公众号微信支付", "微信支付");
                    return(2);
                }
                WxPayData data = new WxPayData();
                data.SetValue("out_trade_no", out_trade_no);
                WxPayData result      = WxPayApi.OrderQuery(data);//提交订单查询请求给API,接收返回数据
                var       sort_list   = data.FromXml(result.ToXml());
                var       trade_state = result.GetValue("trade_state");
                if (trade_state != null && trade_state.ToString() == "SUCCESS")
                {
                    Web.APPCode.PaymentHelper.SaveRoomFee(out_trade_no, "微信公众号微信支付", "微信支付");
                    return(2);
                }
                return(1);
            }
            if (exist_payment.PaymentType.Equals(Utility.EnumModel.PaymentTypeDefine.alipay.ToString()))
            {
                if (exist_payment.Status == 2)
                {
                    Web.APPCode.PaymentHelper.SaveRoomFee(out_trade_no, "微信公众号支付宝支付", "支付宝");
                    return(2);
                }
                return(AlipayOrderQuery(out_trade_no));
            }
            if (exist_payment.PaymentType.Equals(Utility.EnumModel.PaymentTypeDefine.app_wx.ToString()))
            {
                if (exist_payment.Status == 2)
                {
                    Web.APPCode.PaymentHelper.SaveRoomFee(out_trade_no, "APP微信支付", "微信支付");
                    return(2);
                }
                WxPayData data = new WxPayData();
                data.SetValue("out_trade_no", out_trade_no);
                WxPayData result      = WxPayApi.OrderQueryAPP(data);//提交订单查询请求给API,接收返回数据
                var       sort_list   = data.FromXml(result.ToXml());
                var       trade_state = result.GetValue("trade_state");
                if (trade_state != null && trade_state.ToString() == "SUCCESS")
                {
                    Web.APPCode.PaymentHelper.SaveRoomFee(out_trade_no, "APP微信支付", "微信支付");
                    return(2);
                }
                return(1);
            }
            if (exist_payment.PaymentType.Equals(Utility.EnumModel.PaymentTypeDefine.app_alipay.ToString()))
            {
                if (exist_payment.Status == 2)
                {
                    Web.APPCode.PaymentHelper.SaveRoomFee(out_trade_no, "APP支付宝支付", "支付宝");
                    return(2);
                }
                return(AlipayAPPOrderQuery(out_trade_no));
            }
            return(1);
        }
示例#29
0
        public ActionResult ProcessPayment(FormCollection form)
        {
            var model     = new WeiXinPaymentModel(Path.Combine(_webHelper.GetStoreHost(_webHelper.IsCurrentConnectionSecured()), "Plugins/PaymentWeiXin/QueryOrder"));
            var error     = new WeiXinPaymentErrorModel();
            var processor = _paymentService.LoadPaymentMethodBySystemName("Payments.WeiXin") as WeiXinPaymentProcessor;

            if (processor == null ||
                !processor.IsPaymentMethodActive(_paymentSettings) || !processor.PluginDescriptor.Installed)
            {
                error.Message = "微信支付服务终止";
            }
            else
            {
                try
                {
                    if (form.HasKeys())
                    {
                        if (!string.IsNullOrWhiteSpace(form["result"]))
                        {
                            var wxModel = new WxPayData();
                            wxModel.FromXml(HttpUtility.HtmlDecode(form["result"]), _weiXinPaymentSettings.AppSecret);


                            if (wxModel.IsSet("code_url"))
                            {
                                model.QRCode = processor.GetQrCode(wxModel.GetValue("code_url").ToString());


                                if (!string.IsNullOrWhiteSpace(form["orderid"]))
                                {
                                    int orderId;
                                    if (int.TryParse(form["orderid"], out orderId))
                                    {
                                        var order = _orderService.GetOrderById(orderId);
                                        if (order != null)
                                        {
                                            if (order.Customer.Id == _workContext.CurrentCustomer.Id)
                                            {
                                                if (_orderProcessingService.CanMarkOrderAsPaid(order))
                                                {
                                                    if (!string.IsNullOrWhiteSpace(form["total"]) &&
                                                        form["total"] == order.OrderTotal.ToString("0.00"))
                                                    {
                                                        model.OrderId = order.Id.ToString(CultureInfo.InvariantCulture);
                                                        model.Total   = order.OrderTotal.ToString("¥0.00");
                                                    }
                                                    else
                                                    {
                                                        error.Message = "价格不匹配";
                                                    }
                                                }
                                                else
                                                {
                                                    if (order.PaymentStatus == PaymentStatus.Paid)
                                                    {
                                                        error.Message = "您已付款,请勿重复提交";
                                                    }
                                                    else
                                                    {
                                                        error.Message = "订单状态错误";
                                                    }
                                                }
                                            }
                                            else
                                            {
                                                error.Message = "用户不匹配";
                                            }
                                        }
                                        else
                                        {
                                            error.Message = "订单号不存在";
                                        }
                                    }
                                    else
                                    {
                                        error.Message = "无法读取订单号";
                                    }
                                }
                                else
                                {
                                    error.Message = "订单号丢失";
                                }
                            }
                            else
                            {
                                error.Message = "无法读取二维码";
                            }
                        }
                        else if (!string.IsNullOrWhiteSpace(form["nativeUrl"]))
                        {
                            model.QRCode = processor.GetQrCode(form["nativeUrl"]);

                            if (!string.IsNullOrWhiteSpace(form["orderid"]))
                            {
                                int orderId;
                                if (int.TryParse(form["orderid"], out orderId))
                                {
                                    var order = _orderService.GetOrderById(orderId);
                                    if (order != null)
                                    {
                                        if (order.Customer.Id == _workContext.CurrentCustomer.Id)
                                        {
                                            if (_orderProcessingService.CanMarkOrderAsPaid(order))
                                            {
                                                if (!string.IsNullOrWhiteSpace(form["total"]) &&
                                                    form["total"] == order.OrderTotal.ToString("0.00"))
                                                {
                                                    model.OrderId = order.Id.ToString(CultureInfo.InvariantCulture);
                                                    model.Total   = order.OrderTotal.ToString("¥0.00");
                                                }
                                                else
                                                {
                                                    error.Message = "价格不匹配";
                                                }
                                            }
                                            else
                                            {
                                                if (order.PaymentStatus == PaymentStatus.Paid)
                                                {
                                                    error.Message = "您已付款,请勿重复提交";
                                                }
                                                else
                                                {
                                                    error.Message = "订单状态错误";
                                                }
                                            }
                                        }
                                        else
                                        {
                                            error.Message = "用户不匹配";
                                        }
                                    }
                                    else
                                    {
                                        error.Message = "订单号不存在";
                                    }
                                }
                                else
                                {
                                    error.Message = "无法读取订单号";
                                }
                            }
                            else
                            {
                                error.Message = "订单号丢失";
                            }
                        }
                        else
                        {
                            error.Message = "参数错误";
                        }
                    }
                    else
                    {
                        error.Message = "没有参数";
                    }
                }
                catch (NopException ex)
                {
                    error.Message = ex.Message;
                }
            }



            if (error.HasError)
            {
                return(View("~/Plugins/Payments.WeiXin/Views/PaymentWeiXin/Error.cshtml", error));
            }
            return(View("~/Plugins/Payments.WeiXin/Views/PaymentWeiXin/ProcessPayment.cshtml", model));
        }
示例#30
0
    /**
     *
     * 统一下单
     * @param WxPaydata inputObj 提交给统一下单API的参数
     * @param int timeOut 超时时间
     * @throws WxPayException
     * @return 成功时返回,其他抛异常
     */
    public static WxPayData UnifiedOrder(WxPayData inputObj, int timeOut = 6)
    {
        string url = "https://api.mch.weixin.qq.com/pay/unifiedorder";

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

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

        //异步通知url未设置,则使用配置文件中的url
        if (!inputObj.IsSet("notify_url"))
        {
            inputObj.SetValue("notify_url", ApiHelper.GetWebLocation() + "/api/pay/alinotify");//异步通知url
        }

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

        //签名
        inputObj.SetValue("sign", inputObj.MakeSign());
        string xml = "";

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

        try
        {
            response = HttpService.Post(xml, url, false, timeOut);
        }
        catch (Exception eeee)
        {
        }
        var end      = DateTime.Now;
        int timeCost = (int)((end - start).TotalMilliseconds);

        WxPayData result = new WxPayData();

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

        return(result);
    }
        /// <summary>
        /// 将XML转换成实体类
        /// </summary>
        /// <param name="ds"></param>
        /// <returns></returns>
        public WxPayNotifyData GetWxPayNotifyData(string xml)
        {
            WxPayData       tempObj = new WxPayData(wcf);
            WxPayNotifyData wxObj   = new WxPayNotifyData();

            SortedDictionary <string, Object> dic = tempObj.FromXml(xml);

            // 微信开放平台审核通过的应用APPID
            var wx_appid = "";
            // 微信支付的订单名称
            var wx_attach = "";
            // 微信支付分配的商户号
            var wx_mch_id = "";
            // 随机字符串,不长于32位
            var wx_nonce_str = "";
            // 签名,详见签名算法
            var wx_sign = "";
            // 回执:SUCCESS/FAIL
            var wx_result_code = "";
            // 回执:SUCCESS/FAIL
            var wx_return_code = "";
            // 用户在商户appid下的唯一标识
            var wx_openid = "";
            // 用户是否关注公众账号,Y-关注,N-未关注,仅在公众账号类型支付有效
            var wx_is_subscribe = "";
            // APP
            var wx_trade_type = "";
            // 银行类型,采用字符串类型的银行标识,银行类型见银行列表
            var wx_bank_type = "";
            // 货币类型,符合ISO4217标准的三位字母代码,默认人民币:CNY,其他值列表详见货币类型
            var wx_fee_type = "";
            // 微信支付订单号
            var wx_transaction_id = "";
            // 商户系统的订单号,与请求一致
            var wx_out_trade_no = "";
            // 支付完成时间,格式为yyyyMMddHHmmss,如2009年12月25日9点10分10秒表示为20091225091010。其他详见时间规则
            var wx_time_end = "";
            // 订单总金额,单位为分
            var wx_total_fee = 1;
            // 现金支付金额订单现金支付金额,详见支付金额
            var wx_cash_fee = 1;

            var result_code = dic.Where(r => "result_code".Equals(r.Key));
            var return_code = dic.Where(r => "returen_code".Equals(r.Key));

            //wx_appid
            if (dic.ContainsKey("appid"))
            {
                wx_appid = dic["appid"].ToString();
                if (!string.IsNullOrEmpty(wx_appid))
                {
                    wxObj.appid = wx_appid;
                }
            }
            //wx_attach
            if (dic.ContainsKey("attach"))
            {
                wx_attach = dic["attach"].ToString();
                if (!string.IsNullOrEmpty(wx_attach))
                {
                    wxObj.attch = wx_attach;
                }
            }
            //wx_bank_type
            if (dic.ContainsKey("bank_type"))
            {
                wx_bank_type = dic["bank_type"].ToString();
                if (!string.IsNullOrEmpty(wx_bank_type))
                {
                    wxObj.bank_type = wx_bank_type;
                }
            }
            //wx_cash_fee
            if (dic.ContainsKey("cash_fee"))
            {
                wx_cash_fee    = Convert.ToInt32(dic["cash_fee"].ToString());
                wxObj.cash_fee = wx_cash_fee;
            }

            //wx_fee_type
            if (dic.ContainsKey("fee_type"))
            {
                wx_fee_type = dic["fee_type"].ToString();
                if (!string.IsNullOrEmpty(wx_fee_type))
                {
                    wxObj.fee_type = wx_fee_type;
                }
            }

            //wx_is_subscribe
            if (dic.ContainsKey("is_subscribe"))
            {
                wx_is_subscribe = dic["is_subscribe"].ToString();
                if (!string.IsNullOrEmpty(wx_is_subscribe))
                {
                    wxObj.is_subscribe = wx_is_subscribe;
                }
            }

            //wx_mch_id
            if (dic.ContainsKey("mch_id"))
            {
                wx_mch_id = dic["mch_id"].ToString();
                if (!string.IsNullOrEmpty(wx_mch_id))
                {
                    wxObj.mch_id = wx_mch_id;
                }
            }

            //wx_nonce_str
            if (dic.ContainsKey("nonce_str"))
            {
                wx_nonce_str = dic["nonce_str"].ToString();
                if (!string.IsNullOrEmpty(wx_nonce_str))
                {
                    wxObj.nonce_str = wx_nonce_str;
                }
            }

            //wx_openid
            if (dic.ContainsKey("openid"))
            {
                wx_openid = dic["openid"].ToString();
                if (!string.IsNullOrEmpty(wx_openid))
                {
                    wxObj.openid = wx_openid;
                }
            }

            //wx_out_trade_no
            if (dic.ContainsKey("out_trade_no"))
            {
                wx_out_trade_no = dic["out_trade_no"].ToString();
                if (!string.IsNullOrEmpty(wx_out_trade_no))
                {
                    wxObj.out_trade_no = wx_out_trade_no;
                }
            }

            //wx_result_code
            if (dic.ContainsKey("result_code"))
            {
                wx_result_code = dic["result_code"].ToString();
                if (!string.IsNullOrEmpty(wx_result_code))
                {
                    wxObj.result_code = wx_result_code;
                }
            }

            //wx_result_code
            if (dic.ContainsKey("return_code"))
            {
                wx_return_code = dic["return_code"].ToString();
                if (!string.IsNullOrEmpty(wx_return_code))
                {
                    wxObj.return_code = wx_return_code;
                }
            }

            //wx_sign
            if (dic.ContainsKey("sign"))
            {
                wx_sign    = dic["sign"].ToString();
                wxObj.sign = wx_sign;
            }

            //wx_time_end
            if (dic.ContainsKey("time_end"))
            {
                wx_time_end = dic["time_end"].ToString();
                if (!string.IsNullOrEmpty(wx_time_end))
                {
                    wxObj.time_end = wx_time_end;
                }
            }

            //wx_total_fee
            if (dic.ContainsKey("total_fee"))
            {
                wx_total_fee    = Convert.ToInt32(dic["total_fee"].ToString());
                wxObj.total_fee = wx_total_fee;
            }

            //wx_trade_type
            if (dic.ContainsKey("trade_type"))
            {
                wx_trade_type = dic["trade_type"].ToString();
                if (!string.IsNullOrEmpty(wx_trade_type))
                {
                    wxObj.trade_type = wx_trade_type;
                }
            }

            //wx_transaction_id
            if (dic.ContainsKey("transaction_id"))
            {
                wx_transaction_id = dic["transaction_id"].ToString();
                if (!string.IsNullOrEmpty(wx_transaction_id))
                {
                    wxObj.transaction_id = wx_transaction_id;
                }
            }
            return(wxObj);
        }