Ejemplo n.º 1
0
        /// <summary>
        /// 转换短链接,该接口主要用于扫码原生支付模式一中的二维码链接转成短链接(weixin://wxpay/s/XXXXXX),减小二维码数据量,提升扫描速度和精确度。
        /// </summary>
        /// <param name="inputObj">提交给转换短连接API的参数</param>
        /// <param name="timeOut">接口超时时间</param>
        /// <returns></returns>
        public static WxPayData ShortUrl(WxPayData inputObj, PayCenterSetting setting, int timeOut = 20)
        {
            string url = "https://api.mch.weixin.qq.com/tools/shorturl";

            //检测必填参数
            if (!inputObj.IsSet("long_url"))
            {
                throw new WxPayException("需要转换的URL,签名用原串,传输需URL encode!");
            }
            string appid  = WxPayConfig.APPID;
            string mch_id = WxPayConfig.MCHID;
            string key    = string.Empty;

            if (setting != null && setting.Id > 0)
            {
                appid  = setting.Appid;
                mch_id = setting.Mch_id;
                key    = setting.Key;
            }
            inputObj.SetValue("appid", appid);                  //公众账号ID
            inputObj.SetValue("mch_id", mch_id);                //商户号
            inputObj.SetValue("nonce_str", GenerateNonceStr()); //随机字符串
            inputObj.SetValue("sign", inputObj.MakeSign(key));  //签名
            string xml = inputObj.ToXml();

            string    response = WxHelper.Post(xml, url, false, setting, timeOut);
            WxPayData result   = new WxPayData();

            result.FromXml(response);

            return(result);
        }
Ejemplo n.º 2
0
 /// <summary>
 /// 判断提现结果 只有返回为1才表示提现成功
 /// </summary>
 /// <param name="result"></param>
 /// <param name="amout"></param>
 /// <param name="setting"></param>
 /// <returns></returns>
 public int DrawResult(WxPayData result, int amout, PayCenterSetting setting)
 {
     if (result == null || result.GetValue("return_code") == null)//微信服务器有返回值
     {
         log4net.LogHelper.WriteInfo(this.GetType(), "提现出错,错误信息:" + result.ToJson());
         return(-1);
     }
     //业务结果:result_code(SUCCESS/FAIL,为SUCCESS才是付款成功)
     if (result.GetValue("result_code").ToString() != "SUCCESS")//提现失败
     {
         if (result.GetValue("err_code_des").ToString().Contains("原单号"))
         {
             //表示微信那边返回系统错误 则该提现记录不能算失败也不能算成功,维持原状等待下次提现队列
             return(-2);
         }
         //如果是账户余额不足,推送消息给管理员
         if (result.GetValue("err_code").ToString() == "NOTENOUGH")
         {
             return(-3);
         }
         log4net.LogHelper.WriteInfo(this.GetType(), "提现出错,错误信息2:" + result.ToJson());
         return(0);
     }
     else//成功,修改记录
     {
         log4net.LogHelper.WriteInfo(this.GetType(), "提现成功:" + result.ToJson());
         return(1);
     }
 }
Ejemplo n.º 3
0
        /// <summary>
        /// 关闭订单
        /// </summary>
        /// <param name="inputObj">提交给关闭订单API的参数</param>
        /// <param name="timeOut">接口超时时间</param>
        /// <returns></returns>
        public static WxPayData CloseOrder(WxPayData inputObj, PayCenterSetting setting, int timeOut = 20)
        {
            string url = "https://api.mch.weixin.qq.com/pay/closeorder";

            //检测必填参数
            if (!inputObj.IsSet("out_trade_no"))
            {
                throw new WxPayException("关闭订单接口中,out_trade_no必填!");
            }
            string appid  = WxPayConfig.APPID;
            string mch_id = WxPayConfig.MCHID;
            string key    = string.Empty;

            if (setting != null && setting.Id > 0)
            {
                appid  = setting.Appid;
                mch_id = setting.Mch_id;
                key    = setting.Key;
            }
            inputObj.SetValue("appid", appid);                  //公众账号ID
            inputObj.SetValue("mch_id", mch_id);                //商户号
            inputObj.SetValue("nonce_str", GenerateNonceStr()); //随机字符串
            inputObj.SetValue("sign", inputObj.MakeSign(key));  //签名
            string xml      = inputObj.ToXml();
            string response = WxHelper.Post(xml, url, false, setting, timeOut);

            WxPayData result = new WxPayData();

            result.FromXml(response);

            return(result);
        }
Ejemplo n.º 4
0
        public void NOTENOUGH(string amout, PayCenterSetting setting = null)
        {
            if (WebSiteConfig.IsSendToAdmin != "1")
            {
                return;
            }
            if (setting == null)
            {
                setting       = new PayCenterSetting();
                setting.Appid = "wx9dc9ddc7b3eb7f8d";
            }
            if (WebConfigBLL.WzCompanyAppidList.Contains(setting.Appid))
            {
                int[]  userids  = new int[] { 10475223, 483747, 181993615 };
                string tid      = "faxeaBv8TpcHNzgH5g_-23_yFSwXnI_fJqqJ5QYsVFY";
                string openid   = "";
                string title    = "报警:用户提现余额不足,请尽快充值!用户提现金额:" + amout + "(元),提现APPID:" + setting.Appid;
                string fromName = "微赞";
                string remark   = "如10分钟之后发现提现余额不足,会继续提醒";
                string datajson = "{\"first\": {\"value\":\"" + title + "\",\"color\":\"#FF0000\"},\"keyword1\":{\"value\":\"" + fromName + "\",\"color\":\"#333333\"},\"keyword2\": {\"value\":\"" + DateTime.Now.ToString("yyyy-MM-dd HH:mm") + "\",\"color\":\"#333333\"},\"keyword3\": {\"value\":\"点击查看详情\",\"color\":\"#333333\"},\"remark\":{\"value\":\"" + remark + "\",\"color\":\"#17b5ee\"}}";;

                string postjson = "";
                string _mySerId = WebSiteConfig.WxSerId;
                foreach (int uid in userids)
                {
                    openid   = new OAuthUserBll("3").GetModel(uid).Openid;
                    postjson = "{\"touser\":\"" + openid + "\",\"template_id\":\"" + tid + "\",\"url\":\"\",\"data\":" + datajson + "}";
                    string posturl = string.Format(this.DomainName(_mySerId) + "/cgi-bin/message/template/send?access_token={0}", _mySerId);
                    Utility.Net.JKClient.DoPostJson(posturl, postjson);
                    //new PushMsgBLL().SendTips(_minisnsid, model.openid, url, "您好,[" + nickName + "]回复帖子[" + _titletips + "]: " + _contenttips, _forumname, "点击查看详情.祝您生活愉快^.^");
                }
            }
            else
            {
                if (setting.BindingType == (int)PayCenterSettingType.City)
                {
                    C_CityInfo city = new C_CityInfoBLL().GetModelByAreaCode(setting.BindingId);
                    C_UserInfo info = new C_UserInfoBLL().GetModelFromCache(city.OpenId);

                    string tid      = "faxeaBv8TpcHNzgH5g_-23_yFSwXnI_fJqqJ5QYsVFY";
                    string openid   = city.OpenId;
                    string title    = "报警:用户提现余额不足,请尽快充值!用户提现金额:" + amout + "(元),提现APPID:" + setting.Appid + "。充值之后请登陆PC管理后台->同城流水,找到余额不足的提现流水,点击重新提现(重新提现不会造成重复提现的现象)";
                    string fromName = "微赞";
                    string remark   = "如10分钟之后发现提现余额不足,会继续提醒";
                    string datajson = "{\"first\": {\"value\":\"" + title + "\",\"color\":\"#FF0000\"},\"keyword1\":{\"value\":\"" + fromName + "\",\"color\":\"#333333\"},\"keyword2\": {\"value\":\"" + DateTime.Now.ToString("yyyy-MM-dd HH:mm") + "\",\"color\":\"#333333\"},\"keyword3\": {\"value\":\"点击查看详情\",\"color\":\"#333333\"},\"remark\":{\"value\":\"" + remark + "\",\"color\":\"#17b5ee\"}}";;

                    string postjson = "";
                    string _mySerId = WebSiteConfig.WxSerId;

                    postjson = "{\"touser\":\"" + openid + "\",\"template_id\":\"" + tid + "\",\"url\":\"\",\"data\":" + datajson + "}";
                    string posturl = string.Format(this.DomainName(_mySerId) + "/cgi-bin/message/template/send?access_token={0}", _mySerId);
                    Utility.Net.JKClient.DoPostJson(posturl, postjson);
                }
            }
        }
Ejemplo n.º 5
0
        /// <summary>
        /// 提交被扫支付API,收银员使用扫码设备读取微信用户刷卡授权码以后,二维码或条码信息传送至商户收银台,由商户收银台或者商户后台调用该接口发起支付。
        /// </summary>
        /// <param name="inputObj">提交给被扫支付API的参数</param>
        /// <param name="timeOut">超时时间</param>
        /// <returns>成功时返回调用结果</returns>
        //public static WxPayData Micropay(WxPayData inputObj, PayCenterSetting setting = null, int timeOut = 20)
        //{
        //    string url = "https://api.mch.weixin.qq.com/pay/micropay";
        //    //检测必填参数
        //    if (!inputObj.IsSet("body"))
        //    {
        //        throw new WxPayException("提交被扫支付API接口中,缺少必填参数body!");
        //    }
        //    else if (!inputObj.IsSet("out_trade_no"))
        //    {
        //        throw new WxPayException("提交被扫支付API接口中,缺少必填参数out_trade_no!");
        //    }
        //    else if (!inputObj.IsSet("total_fee"))
        //    {
        //        throw new WxPayException("提交被扫支付API接口中,缺少必填参数total_fee!");
        //    }
        //    else if (!inputObj.IsSet("auth_code"))
        //    {
        //        throw new WxPayException("提交被扫支付API接口中,缺少必填参数auth_code!");
        //    }
        //    string appid = WxPayConfig.APPID;
        //    string mch_id = WxPayConfig.MCHID;
        //    string key = string.Empty;
        //    if (setting != null && setting.Id > 0)
        //    {
        //        appid = setting.Appid;
        //        mch_id = setting.Mch_id;
        //        key = setting.Key;
        //    }
        //    inputObj.SetValue("spbill_create_ip", WxPayConfig.IP);//终端ip
        //    inputObj.SetValue("appid", appid);//公众账号ID
        //    inputObj.SetValue("mch_id", mch_id);//商户号
        //    inputObj.SetValue("nonce_str", Guid.NewGuid().ToString().Replace("-", ""));//随机字符串
        //    inputObj.SetValue("sign", inputObj.MakeSign(key));//签名
        //    string xml = inputObj.ToXml();

        //    //var start = DateTime.Now;//请求开始时间
        //    string response = WxHelper.Post(xml, url, false, setting, timeOut);//调用HTTP通信接口以提交数据到API
        //    // var end = DateTime.Now;
        //    //int timeCost = (int)((end - start).TotalMilliseconds);//获得接口耗时
        //    //将xml格式的结果转换为对象以返回
        //    WxPayData result = new WxPayData();
        //    result.FromXml(response);
        //    //ReportCostTime(url, timeCost, result);//关掉测速上报,
        //    return result;
        //}

        /// <summary>
        ///  查询订单
        /// </summary>
        /// <param name="inputObj">提交给查询订单API的参数</param>
        /// <param name="timeOut">超时时间</param>
        /// <returns>成功时返回订单查询结果</returns>
        public static WxPayData OrderQuery(WxPayData inputObj, PayCenterSetting setting, int timeOut = 60)
        {
            WxPayData result = new WxPayData();
            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至少填一个!");
            }
            string appid  = WxPayConfig.APPID;
            string mch_id = WxPayConfig.MCHID;
            string key    = string.Empty;

            if (setting != null && setting.Id > 0)
            {
                appid  = setting.Appid;
                mch_id = setting.Mch_id;
                key    = setting.Key;
            }
            inputObj.SetValue("appid", appid);                           //公众账号ID
            inputObj.SetValue("mch_id", mch_id);                         //商户号
            inputObj.SetValue("nonce_str", WxPayApi.GenerateNonceStr()); //随机字符串
            inputObj.SetValue("sign", inputObj.MakeSign(key));           //签名

            string xml = inputObj.ToXml();

            DateTime start    = DateTime.Now;
            string   response = string.Empty;

            try
            {
                response = WxHelper.Post(xml, url, false, setting, timeOut);//调用HTTP通信接口提交数据
            }
            catch (WxPayException)
            {
                PayTimeOutOrder addModel = new PayTimeOutOrder();
                addModel.transaction_id = inputObj.GetValue("transaction_id") == null ? "" : inputObj.GetValue("transaction_id").ToString();
                //记录查询超时的订单
                //new PayTimeOutOrderBLL().Add(addModel);
                result.SetValue("return_code", "FAILE");
                return(result);
            }
            // var end = DateTime.Now;
            //int timeCost = (int)((end - start).TotalMilliseconds);//获得接口耗时

            //将xml格式的数据转化为对象以返回

            result.FromXml(response);

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

            return(result);
        }
Ejemplo n.º 6
0
        /// <summary>
        /// 测速上报接口实现
        /// </summary>
        /// <param name="inputObj">提交给测速上报接口的参数</param>
        /// <param name="timeOut">测速上报接口超时时间</param>
        /// <returns></returns>
        public static WxPayData Report(WxPayData inputObj, PayCenterSetting setting, int timeOut = 20)
        {
            string url = "https://api.mch.weixin.qq.com/payitil/report";

            //检测必填参数
            if (!inputObj.IsSet("interface_url"))
            {
                throw new WxPayException("接口URL,缺少必填参数interface_url!");
            }
            if (!inputObj.IsSet("return_code"))
            {
                throw new WxPayException("返回状态码,缺少必填参数return_code!");
            }
            if (!inputObj.IsSet("result_code"))
            {
                throw new WxPayException("业务结果,缺少必填参数result_code!");
            }
            if (!inputObj.IsSet("user_ip"))
            {
                throw new WxPayException("访问接口IP,缺少必填参数user_ip!");
            }
            if (!inputObj.IsSet("execute_time_"))
            {
                throw new WxPayException("接口耗时,缺少必填参数execute_time_!");
            }
            string appid  = WxPayConfig.APPID;
            string mch_id = WxPayConfig.MCHID;
            string key    = string.Empty;

            if (setting != null && setting.Id > 0)
            {
                appid  = setting.Appid;
                mch_id = setting.Mch_id;
                key    = setting.Key;
            }
            inputObj.SetValue("appid", appid);                                  //公众账号ID
            inputObj.SetValue("mch_id", mch_id);                                //商户号
            inputObj.SetValue("user_ip", WxPayConfig.IP);                       //终端ip
            inputObj.SetValue("time", DateTime.Now.ToString("yyyyMMddHHmmss")); //商户上报时间
            inputObj.SetValue("nonce_str", GenerateNonceStr());                 //随机字符串
            inputObj.SetValue("sign", inputObj.MakeSign(key));                  //签名
            string xml = inputObj.ToXml();

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

            WxPayData result = new WxPayData();

            result.FromXml(response);
            return(result);
        }
Ejemplo n.º 7
0
        //查询订单
        private bool QueryOrder(string transactionId, PayCenterSetting setting)
        {
            WxPayData req = new WxPayData();

            req.SetValue("transaction_id", transactionId);
            WxPayData res = WxPayApi.OrderQuery(req, setting);

            if (res.GetValue("return_code").ToString() == "SUCCESS" &&
                res.GetValue("result_code").ToString() == "SUCCESS")
            {
                return(true);
            }
            return(false);
        }
Ejemplo n.º 8
0
        /// <summary>
        /// 申请退款
        /// </summary>
        /// <param name="inputObj">提交给申请退款API的参数</param>
        /// <param name="timeOut">超时时间</param>
        /// <returns>成功时返回接口调用结果</returns>
        public static WxPayData Refund(WxPayData inputObj, PayCenterSetting setting, int timeOut = 20)
        {
            string url = "https://api.mch.weixin.qq.com/secapi/pay/refund";

            //检测必填参数
            if (!inputObj.IsSet("out_trade_no") && !inputObj.IsSet("transaction_id"))
            {
                throw new WxPayException("退款申请接口中,out_trade_no、transaction_id至少填一个!");
            }
            else if (!inputObj.IsSet("out_refund_no"))
            {
                throw new WxPayException("退款申请接口中,缺少必填参数out_refund_no!");
            }
            else if (!inputObj.IsSet("total_fee"))
            {
                throw new WxPayException("退款申请接口中,缺少必填参数total_fee!");
            }
            else if (!inputObj.IsSet("refund_fee"))
            {
                throw new WxPayException("退款申请接口中,缺少必填参数refund_fee!");
            }
            else if (!inputObj.IsSet("op_user_id"))
            {
                throw new WxPayException("退款申请接口中,缺少必填参数op_user_id!");
            }
            string appid  = WxPayConfig.APPID;
            string mch_id = WxPayConfig.MCHID;
            string key    = string.Empty;

            if (setting != null && setting.Id > 0)
            {
                appid  = setting.Appid;
                mch_id = setting.Mch_id;
                key    = setting.Key;
            }
            inputObj.SetValue("appid", appid);                                          //公众账号ID
            inputObj.SetValue("mch_id", mch_id);                                        //商户号
            inputObj.SetValue("nonce_str", Guid.NewGuid().ToString().Replace("-", "")); //随机字符串
            inputObj.SetValue("sign", inputObj.MakeSign(key));                          //签名
            string xml = inputObj.ToXml();
            //调用HTTP通信接口提交数据到API
            string response = WxHelper.Post(xml, url, true, setting, timeOut);
            //将xml格式的结果转换为对象以返回
            WxPayData result = new WxPayData();

            result.FromXml(response);
            return(result);
        }
Ejemplo n.º 9
0
        /// <summary>
        ///  查询订单
        /// </summary>
        /// <param name="inputObj">提交给查询订单API的参数</param>
        /// <param name="timeOut">超时时间</param>
        /// <returns>成功时返回订单查询结果</returns>
        public static WxPayData OrderQuery(WxPayData inputObj, PayCenterSetting setting, int timeOut = 60)
        {
            WxPayData result = new WxPayData();
            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至少填一个!");
            }
            string appid  = WxPayConfig.APPID;
            string mch_id = WxPayConfig.MCHID;
            string key    = string.Empty;

            if (setting != null && setting.Id > 0)
            {
                appid  = setting.Appid;
                mch_id = setting.Mch_id;
                key    = setting.Key;
            }
            inputObj.SetValue("appid", appid);                           //公众账号ID
            inputObj.SetValue("mch_id", mch_id);                         //商户号
            inputObj.SetValue("nonce_str", WxPayApi.GenerateNonceStr()); //随机字符串
            inputObj.SetValue("sign", inputObj.MakeSign(key));           //签名

            string xml = inputObj.ToXml();

            DateTime start    = DateTime.Now;
            string   response = string.Empty;

            try
            {
                response = WxHelper.Post(xml, url, false, setting, timeOut);//调用HTTP通信接口提交数据
            }
            catch (WxPayException)
            {
                log4net.LogHelper.WriteInfo(typeof(WxPayApi), $"微信订单查询超时:{(inputObj.GetValue("transaction_id") == null ? "" : inputObj.GetValue("transaction_id").ToString())}");
                result.SetValue("return_code", "FAILE");
                return(result);
            }

            //将xml格式的数据转化为对象以返回
            result.FromXml(response);
            return(result);
        }
Ejemplo n.º 10
0
        /// <summary>
        ///  查询订单
        /// </summary>
        /// <param name="inputObj">提交给查询订单API的参数</param>
        /// <param name="timeOut">超时时间</param>
        /// <returns>成功时返回订单查询结果</returns>
        //public static string CompanyPayQuery(WxPayData inputObj, PayCenterSetting setting, int timeOut = 60)
        //{
        //    string url = "https://api.mch.weixin.qq.com/mmpaymkttransfers/gettransferinfo";
        //    //检测必填参数
        //    if (!inputObj.IsSet("partner_trade_no"))
        //    {
        //        throw new WxPayException("订单查询接口中,partner_trade_no!");
        //    }
        //    string appid = WxPayConfig.APPID;
        //    string mch_id = WxPayConfig.MCHID;
        //    string key = string.Empty;
        //    if (setting != null && setting.Id > 0)
        //    {
        //        appid = setting.Appid;
        //        mch_id = setting.Mch_id;
        //        key = setting.Key;
        //    }
        //    inputObj.SetValue("appid", appid);//公众账号ID
        //    inputObj.SetValue("mch_id", mch_id);//商户号
        //    inputObj.SetValue("nonce_str", WxPayApi.GenerateNonceStr());//随机字符串
        //    inputObj.SetValue("sign", inputObj.MakeSign(key));//签名

        //    string xml = inputObj.ToXml();
        //    //log4net.LogHelper.WriteError(typeof(CompanyPay), new Exception(xml));
        //    //var start = DateTime.Now;

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

        //    //log4net.LogHelper.WriteError(typeof(CompanyPay), new Exception(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;
        //    return response;
        //}
        /// <summary>
        ///  查询订单
        /// </summary>
        /// <param name="inputObj">提交给查询订单API的参数</param>
        /// <param name="timeOut">超时时间</param>
        /// <returns>成功时返回订单查询结果</returns>
        //public static WxPayData CompanyPayQueryData(WxPayData inputObj, PayCenterSetting setting, int timeOut = 60)
        //{
        //    string url = "https://api.mch.weixin.qq.com/mmpaymkttransfers/gettransferinfo";
        //    //检测必填参数
        //    if (!inputObj.IsSet("partner_trade_no"))
        //    {
        //        throw new WxPayException("订单查询接口中,partner_trade_no!");
        //    }
        //    string appid = WxPayConfig.APPID;
        //    string mch_id = WxPayConfig.MCHID;
        //    string key = string.Empty;
        //    if (setting != null && setting.Id > 0)
        //    {
        //        appid = setting.Appid;
        //        mch_id = setting.Mch_id;
        //        key = setting.Key;
        //    }
        //    inputObj.SetValue("appid", appid);//公众账号ID
        //    inputObj.SetValue("mch_id", mch_id);//商户号
        //    inputObj.SetValue("nonce_str", WxPayApi.GenerateNonceStr());//随机字符串
        //    inputObj.SetValue("sign", inputObj.MakeSign(key));//签名

        //    string xml = inputObj.ToXml();
        //    //log4net.LogHelper.WriteError(typeof(CompanyPay), new Exception(xml))
        //    //log4net.LogHelper.WriteError(typeof(CompanyPay), new Exception(xml));
        //    //var start = DateTime.Now;

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

        //    //log4net.LogHelper.WriteError(typeof(CompanyPay), new Exception(response));
        //    //var end = DateTime.Now;
        //    //int timeCost = (int)((end - start).TotalMilliseconds);//获得接口耗时

        //    //将xml格式的数据转化为对象以返回
        //    WxPayData result = new WxPayData();
        //    result.FromXml(response, false);

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

        //    return result;
        //}

        /// <summary>
        /// 撤销订单API接口
        /// </summary>
        /// <param name="inputObj">提交给撤销订单API接口的参数,out_trade_no和transaction_id必填一个</param>
        /// <param name="timeOut">接口超时时间</param>
        /// <returns>成功时返回API调用结果</returns>
        public static WxPayData Reverse(WxPayData inputObj, PayCenterSetting setting, int timeOut = 60)
        {
            string url = "https://api.mch.weixin.qq.com/secapi/pay/reverse";

            //检测必填参数
            if (!inputObj.IsSet("out_trade_no") && !inputObj.IsSet("transaction_id"))
            {
                throw new WxPayException("撤销订单API接口中,参数out_trade_no和transaction_id必须填写一个!");
            }
            string appid  = WxPayConfig.APPID;
            string mch_id = WxPayConfig.MCHID;
            string key    = string.Empty;

            if (setting != null && setting.Id > 0)
            {
                appid  = setting.Appid;
                mch_id = setting.Mch_id;
                key    = setting.Key;
            }

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

            string xml = inputObj.ToXml();

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


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


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

            WxPayData result = new WxPayData();

            result.FromXml(response);

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

            return(result);
        }
Ejemplo n.º 11
0
Archivo: Data.cs Proyecto: soon14/vzan
        /**
         *
         * 检测签名是否正确
         * 正确返回true,错误抛异常
         */
        public bool CheckSign()
        {
            //如果没有设置签名,则跳过检测
            if (!IsSet("sign"))
            {
                WxPayException exx = new WxPayException("WxPayData签名存在但不合法!");
                log4net.LogHelper.WriteError(this.GetType(), exx);
                throw exx;
            }
            //如果设置了签名但是签名为空,则抛异常
            else if (GetValue("sign") == null || GetValue("sign").ToString() == "")
            {
                WxPayException exx = new WxPayException("WxPayData签名存在但不合法!");
                log4net.LogHelper.WriteError(this.GetType(), exx);
                throw exx;
            }

            //获取接收到的签名
            string return_sign = GetValue("sign").ToString();
            //第三方支付需要查询KEY的值
            string key = string.Empty;

            if (IsSet("appid"))
            {
                string           appid   = GetValue("appid").ToString();
                PayCenterSetting setting = PayCenterSettingBLL.SingleModel.GetPayCenterSetting(appid);
                if (setting != null && setting.Id > 0)
                {
                    key = setting.Key;
                }
            }
            //在本地计算新的签名
            string cal_sign = MakeSign(key);

            if (cal_sign == return_sign)
            {
                return(true);
            }

            WxPayException ex = new WxPayException("WxPayData签名验证错误!");

            log4net.LogHelper.WriteError(this.GetType(), ex);
            throw ex;;
        }
Ejemplo n.º 12
0
        /// <summary>
        /// 下载对账单
        /// </summary>
        /// <param name="inputObj">提交给下载对账单API的参数</param>
        /// <param name="timeOut">接口超时时间</param>
        /// <returns></returns>
        public static WxPayData DownloadBill(WxPayData inputObj, PayCenterSetting setting, int timeOut = 20)
        {
            string url = "https://api.mch.weixin.qq.com/pay/downloadbill";

            //检测必填参数
            if (!inputObj.IsSet("bill_date"))
            {
                throw new WxPayException("对账单接口中,缺少必填参数bill_date!");
            }
            string appid  = WxPayConfig.APPID;
            string mch_id = WxPayConfig.MCHID;
            string key    = string.Empty;

            if (setting != null && setting.Id > 0)
            {
                appid  = setting.Appid;
                mch_id = setting.Mch_id;
                key    = setting.Key;
            }
            inputObj.SetValue("appid", appid);                  //公众账号ID
            inputObj.SetValue("mch_id", mch_id);                //商户号
            inputObj.SetValue("nonce_str", GenerateNonceStr()); //随机字符串
            inputObj.SetValue("sign", inputObj.MakeSign(key));  //签名

            string xml = inputObj.ToXml();

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

            WxPayData result = new WxPayData();

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

            return(result);
        }
Ejemplo n.º 13
0
        /// <summary>
        /// 查找当前用户管理的所有账户(找出当前小程序商户号下当前用户管理的分店账号)
        /// </summary>
        /// <returns></returns>
        public List <MultiStoreAccount> GetListByMasterAccountId(Guid AccountId, int appId)
        {
            if (appId <= 0)
            {
                return(null);
            }

            XcxAppAccountRelation role = XcxAppAccountRelationBLL.SingleModel.GetModel(appId);

            if (role == null)
            {
                return(null);
            }
            PayCenterSetting userPaySetting = PayCenterSettingBLL.SingleModel.GetPayCenterSettingByappid(role.AppId);

            if (userPaySetting == null)
            {
                return(null);
            }
            return(GetListByMasterAccountId(AccountId, userPaySetting.Mch_id));
        }
Ejemplo n.º 14
0
        public string GetJsApiParametersnew(PayCenterSetting setting)
        {
            WxPayData jsApiParam = new WxPayData();

            jsApiParam.SetValue("appId", unifiedOrderResult.GetValue("appid"));
            jsApiParam.SetValue("timeStamp", WxPayApi.GenerateTimeStamp());
            jsApiParam.SetValue("nonceStr", unifiedOrderResult.GetValue("nonce_str"));
            //jsApiParam.SetValue("nonceStr2", WxPayApi.GenerateNonceStr());
            jsApiParam.SetValue("package", "prepay_id=" + unifiedOrderResult.GetValue("prepay_id"));
            jsApiParam.SetValue("signType", "MD5");
            //第三方支付需要查询KEY的值
            string key   = string.Empty;
            string appid = unifiedOrderResult.GetValue("appid").ToString();

            //PayCenterSetting setting = new PayCenterSettingBLL().GetPayCenterSetting(appid);
            if (setting != null && setting.Id > 0)
            {
                key = setting.Key;
            }
            jsApiParam.SetValue("paySign", jsApiParam.MakeSign(key));
            //jsApiParam.SetValue("openid", openid);
            return(jsApiParam.ToJson());
        }
Ejemplo n.º 15
0
        /// <summary>
        /// 查询退款,提交退款申请后,通过该接口查询退款状态。退款有一定延时,用零钱支付的退款20分钟内到账,银行卡支付的退款3个工作日后重新查询退款状态。out_refund_no、out_trade_no、transaction_id、refund_id四个参数必填一个
        /// </summary>
        /// <param name="inputObj">提交给查询退款API的参数</param>
        /// <param name="timeOut">接口超时时间</param>
        /// <returns>成功时返回</returns>
        public static WxPayData RefundQuery(WxPayData inputObj, PayCenterSetting setting, int timeOut = 20)
        {
            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四个参数必填一个!");
            }
            string appid  = WxPayConfig.APPID;
            string mch_id = WxPayConfig.MCHID;
            string key    = string.Empty;

            if (setting != null && setting.Id > 0)
            {
                appid  = setting.Appid;
                mch_id = setting.Mch_id;
                key    = setting.Key;
            }
            inputObj.SetValue("appid", appid);                  //公众账号ID
            inputObj.SetValue("mch_id", mch_id);                //商户号
            inputObj.SetValue("nonce_str", GenerateNonceStr()); //随机字符串
            inputObj.SetValue("sign", inputObj.MakeSign(key));  //签名

            string xml = inputObj.ToXml();

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


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

            result.FromXml(response);

            return(result);
        }
Ejemplo n.º 16
0
        public static string Post(string xml, string url, bool isUseCert, PayCenterSetting setting, int timeout = 20)
        {
            // System.GC.Collect();//垃圾回收,回收没有正常关闭的http连接
            string         result    = ""; //返回结果
            HttpWebRequest request   = null;
            Stream         reqStream = null;

            try
            {
                //设置最大连接数
                ServicePointManager.DefaultConnectionLimit = 10000;
                //设置https验证方式
                if (url.StartsWith("https", StringComparison.OrdinalIgnoreCase))
                {
                    ServicePointManager.ServerCertificateValidationCallback =
                        new RemoteCertificateValidationCallback(CheckValidationResult);
                }

                request         = (HttpWebRequest)WebRequest.Create(url);
                request.Method  = "POST";
                request.Timeout = timeout * 1000;
                //设置POST的数据类型和长度
                request.ContentType = "text/xml";
                byte[] data = System.Text.Encoding.UTF8.GetBytes(xml);
                request.ContentLength = data.Length;

                //是否使用证书
                if (isUseCert)
                {
                    //string path = HttpContext.Current.Request.PhysicalApplicationPath;
                    if (setting == null || setting.Appid == WxPayConfig.APPID)
                    {
                        X509Certificate2 cert = new X509Certificate2(WxPayConfig.SSLCERT_PATH, WxPayConfig.SSLCERT_PASSWORD);
                        request.ClientCertificates.Add(cert);
                    }
                    else
                    {
                        if (string.IsNullOrEmpty(setting.SSLCERT_PATH)) //安装路劲没有设置就用默认目录
                        {
                            int index = WxPayConfig.SSLCERT_PATH.LastIndexOf(@"\");
                            setting.SSLCERT_PATH = WxPayConfig.SSLCERT_PATH.Substring(0, index + 1) + setting.Mch_id + "\\" + WxPayConfig.SSLCERT_PATH.Substring(index + 1);
                        }
                        if (string.IsNullOrEmpty(setting.SSLCERT_PASSWORD)) //证书密码没有设置就用默认商户号
                        {
                            setting.SSLCERT_PASSWORD = setting.Mch_id;
                        }
                        X509Certificate2 cert = new X509Certificate2(setting.SSLCERT_PATH, setting.SSLCERT_PASSWORD);
                        request.ClientCertificates.Add(cert);
                    }
                }

                //往服务器写入数据
                using (reqStream = request.GetRequestStream())
                {
                    reqStream.Write(data, 0, data.Length);
                    // reqStream.Close();
                }
                //获取服务端返回
                using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
                    //获取服务端返回数据
                    using (StreamReader sr = new StreamReader(response.GetResponseStream(), Encoding.UTF8))
                    {
                        result = sr.ReadToEnd().Trim();

                        //sr.Close();
                    }
            }
            catch (System.Threading.ThreadAbortException e)
            {
                log4net.LogHelper.WriteError(typeof(System.Threading.ThreadAbortException), e);
                System.Threading.Thread.ResetAbort();
            }
            catch (WebException e)
            {
                log4net.LogHelper.WriteError(typeof(WebException), e);
                if (e.Status == WebExceptionStatus.ProtocolError)
                {
                    log4net.LogHelper.WriteInfo(typeof(WebException), "StatusCode : " + ((HttpWebResponse)e.Response).StatusCode.ToString());
                    log4net.LogHelper.WriteInfo(typeof(WebException), "StatusDescription : " + ((HttpWebResponse)e.Response).StatusCode.ToString());
                }
                throw new WxPayException(e.ToString());
            }
            catch (Exception e)
            {
                log4net.LogHelper.WriteError(typeof(Exception), e);
                throw new WxPayException(e.ToString());
            }
            finally
            {
                if (request != null)
                {
                    request.Abort();
                }
            }
            return(result);
        }
Ejemplo n.º 17
0
        /// <summary>
        /// 抛弃使用(用GetUnifiedOrderResult)
        /// </summary>
        /// <param name="setting"></param>
        /// <param name="morder"></param>
        /// <param name="notify_url"></param>
        /// <returns></returns>
        public WxPayData GetUnifiedOrderResultByCity(PayCenterSetting setting, CityMorders morder, string notify_url)
        {
            //统一下单
            string out_trade_no = morder.orderno;//商户订单号

            if (string.IsNullOrEmpty(morder.orderno))
            {
                throw new WxPayException("UnifiedOrder response error!");
            }
            string body = string.Empty;

            if (!string.IsNullOrEmpty(morder.ShowNote))
            {
                body = morder.ShowNote;
            }
            else
            {
                string paytype = string.Empty;
                switch (morder.OrderType)
                {
                case (int)ArticleTypeEnum.MiniappGoods:
                    paytype = "小程序电商模板订单";
                    break;

                case (int)ArticleTypeEnum.MiniappFoodGoods:
                    paytype = "小程序餐饮模板订单";
                    break;

                case (int)ArticleTypeEnum.MiniappSaveMoneySet:
                    paytype = "小程序餐饮储值";
                    break;

                case (int)ArticleTypeEnum.MiniappBargain:
                    paytype = "小程序砍价";
                    break;

                case (int)ArticleTypeEnum.MiniappEnt:
                    paytype = "小程序专业版";
                    break;

                case (int)ArticleTypeEnum.MiniappWXDirectPay:
                    paytype = "小程序直接微信转账";
                    break;

                case (int)ArticleTypeEnum.PlatChildOrderPay:
                    paytype = "平台子模版支付";
                    break;

                case (int)ArticleTypeEnum.PlatChildOrderInPlatPay:
                    paytype = "子模版订单平台支付";
                    break;
                }
                body = string.Format("支付中心,{0}支付{1}元", paytype, (morder.payment_free * 0.01));                                           //商品描述;
            }
            string attach = string.Format("paytype={0}&orderid={1}&orderno={2}&from=city", morder.OrderType, morder.Id, morder.orderno); //自带的信息
            //统一下单
            WxPayData data = new WxPayData();

            data.SetValue("body", body);
            data.SetValue("attach", attach);
            data.SetValue("out_trade_no", out_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", "test");
            data.SetValue("trade_type", "JSAPI");
            data.SetValue("openid", openid);
            data.SetValue("notify_url", notify_url);
            WxPayData result = WxPayApi.UnifiedOrder(data, setting);

            if (result != null && (!result.IsSet("appid") || !result.IsSet("prepay_id") || !result.IsSet("prepay_id")))
            {
                throw new WxPayException(result.ToJson());
            }
            unifiedOrderResult = result;
            return(result);
        }
Ejemplo n.º 18
0
        /// <summary>
        /// 返回是否关闭成功
        /// </summary>
        /// <param name="setting"></param>
        /// <param name="morder"></param>
        /// <param name="notify_url"></param>
        /// <returns></returns>
        public bool CloseCityMorder(int citymorederId, ref string errorMsg)
        {
            CityMorders morder = new CityMordersBLL().GetModel(citymorederId);

            if (morder == null)
            {
                errorMsg = "未找到citymorder订单";
                return(false);
            }
            PayCenterSetting setting = PayCenterSettingBLL.SingleModel.GetPayCenterSetting(morder.appid);

            if (setting == null)
            {
                errorMsg = "未找到用户的商户配置";
                return(false);
            }


            string out_trade_no = morder.orderno;//商户订单号

            if (string.IsNullOrEmpty(morder.orderno))
            {
                return(false);
            }
            WxPayData data = new WxPayData();

            data.SetValue("out_trade_no", out_trade_no);
            WxPayData result = WxPayApi.CloseOrder(data, setting);

            if (result == null || !result.GetValue("return_code").ToString().Equals("SUCCESS"))
            {
                errorMsg = "请求关闭订单失败,原因为:";
                switch (data.GetValue("return_code").ToString())
                {
                case "ORDERPAID":
                    errorMsg += "订单已支付,不能发起关单";
                    break;

                case "SYSTEMERROR":
                    errorMsg += "系统异常,请重新调用该API";
                    break;

                case "ORDERCLOSED":
                    errorMsg += "订单已关闭,无法重复关闭";
                    break;

                case "SIGNERROR":
                    errorMsg += "签名错误";
                    break;

                case "REQUIRE_POST_METHOD":
                    errorMsg += "未使用post传递参数";
                    break;

                case "XML_FORMAT_ERROR":
                    errorMsg += "XML格式错误";
                    break;
                }
                return(false);
            }
            return(true);
        }
Ejemplo n.º 19
0
        /**
         *
         * 网页授权获取用户基本信息的全部过程
         * 详情请参看网页授权获取用户基本信息:http://mp.weixin.qq.com/wiki/17/c0f37d5704f0b64713d5d2c37b468d75.html
         * 第一步:利用url跳转获取code
         * 第二步:利用code去获取openid和access_token
         *
         */
        //public void GetOpenidAndAccessToken()
        //{
        //    if (!string.IsNullOrEmpty(context.Request.QueryString["code"]))
        //    {
        //        //获取code码,以获取openid和access_token
        //        string code = context.Request.QueryString["code"];
        //        log4net.LogHelper.WriteInfo(this.GetType(), "Get code : " + code);
        //        GetOpenidAndAccessTokenFromCode(code);
        //    }
        //    else
        //    {
        //        //构造网页授权获取code的URL
        //        string host = context.Request.Url.Host;
        //        string path = context.Request.Path;
        //        string redirect_uri = HttpUtility.UrlEncode("http://" + host + path);
        //        WxPayData data = new WxPayData();
        //        data.SetValue("appid", WxPayConfig.APPID);
        //        data.SetValue("redirect_uri", redirect_uri);
        //        data.SetValue("response_type", "code");
        //        data.SetValue("scope", "snsapi_base");
        //        data.SetValue("state", "STATE" + "#wechat_redirect");
        //        string url = "https://open.weixin.qq.com/connect/oauth2/authorize?" + data.ToUrl();
        //        log4net.LogHelper.WriteInfo(this.GetType(), "Will Redirect to URL : " + url);
        //        try
        //        {
        //            //触发微信返回code码
        //            context.Response.Redirect(url);//Redirect函数会抛出ThreadAbortException异常,不用处理这个异常
        //        }
        //        catch (System.Threading.ThreadAbortException )
        //        {
        //        }
        //    }
        //}


        /**
         *
         * 通过code换取网页授权access_token和openid的返回数据,正确时返回的JSON数据包如下:
         * {
         *  "access_token":"ACCESS_TOKEN",
         *  "expires_in":7200,
         *  "refresh_token":"REFRESH_TOKEN",
         *  "openid":"OPENID",
         *  "scope":"SCOPE",
         *  "unionid": "o6_bmasdasdsad6_2sgVt7hMZOPfL"
         * }
         * 其中access_token可用于获取共享收货地址
         * openid是微信支付jsapi支付接口统一下单时必须的参数
         * 更详细的说明请参考网页授权获取用户基本信息:http://mp.weixin.qq.com/wiki/17/c0f37d5704f0b64713d5d2c37b468d75.html
         * @失败时抛异常WxPayException
         */
        //public void GetOpenidAndAccessTokenFromCode(string code)
        //{
        //    try
        //    {
        //        //构造获取openid及access_token的url
        //        WxPayData data = new WxPayData();
        //        data.SetValue("appid", WxPayConfig.APPID);
        //        data.SetValue("secret", WxPayConfig.APPSECRET);
        //        data.SetValue("code", code);
        //        data.SetValue("grant_type", "authorization_code");
        //        string url = "https://api.weixin.qq.com/sns/oauth2/access_token?" + data.ToUrl();

        //        //请求url以获取数据
        //        string result = WxHelper.HttpGet(url);

        //        //保存access_token,用于收货地址获取
        //        WxAuthorize jd = new System.Web.Script.Serialization.JavaScriptSerializer().Deserialize<WxAuthorize>(result);
        //        access_token = jd.access_token;

        //        //获取用户openid
        //        openid = jd.openid;
        //    }
        //    catch (Exception ex)
        //    {
        //        log4net.LogHelper.WriteError(this.GetType(), ex);
        //        throw ex;
        //    }
        //}

        ///// <summary>
        ///// 文章打赏
        ///// </summary>
        ///// <param name="article">文章实体</param>
        ///// <returns></returns>
        //public WxPayData GetUnifiedOrderResult(PayCenterSetting setting,Article article, int luserid, out int orderid, int artcommentid = 0)
        //{
        //    OAuthUserBll bll = new OAuthUserBll(article.MinisnsId.ToString());
        //    OAuthUser looker = bll.GetUserByCache(luserid);
        //    OAuthUser maker = bll.GetUserByCache(article.UserId);

        //    //统一下单
        //    string out_trade_no = WxPayApi.GenerateOutTradeNo();//商户订单号
        //    string body = "赞赏" + (maker == null ? "匿名用户" : Utility.ReplaceSpecialChar(maker.Nickname, '?'));//商品描述
        //    if (article.IsGuerdon == (int)ArticleTypeEnum.Donation)
        //    {
        //        body = "支持" + (maker == null ? "匿名用户" : Utility.ReplaceSpecialChar(maker.Nickname, '?'));//商品描述
        //    }
        //    string attach = "paytype=1&minisnsid=" + article.MinisnsId + "&articleid=" + article.Id + "&userid=" + article.UserId + "&luserId=" + looker.Id;//自带的信息
        //    if (article.IsGuerdon == (int)ArticleTypeEnum.Donation && artcommentid != 0)
        //    {
        //        attach += "&articlecommentid=" + artcommentid;
        //    }
        //    //统一下单
        //    WxPayData data = new WxPayData();
        //    data.SetValue("body", body);
        //    data.SetValue("attach", attach);
        //    data.SetValue("out_trade_no", out_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", "test");
        //    data.SetValue("trade_type", "JSAPI");
        //    data.SetValue("openid", openid);

        //    WxPayData result = WxPayApi.UnifiedOrder(data, setting);

        //    if (!result.IsSet("appid") || !result.IsSet("prepay_id") || result.GetValue("prepay_id").ToString() == "")
        //    {
        //        log4net.LogHelper.WriteError(this.GetType(), new WxPayException("data:" + data.ToJson()));
        //        log4net.LogHelper.WriteError(this.GetType(), new WxPayException("result:" + result.ToJson()));
        //        log4net.LogHelper.WriteError(this.GetType(), new WxPayException("统一下单请求失败!prepay_id:" + result.GetValue("prepay_id").ToString()));
        //        throw new WxPayException("UnifiedOrder response error!");
        //    }
        //    //插入打赏记录
        //    if (maker == null)
        //    {
        //        //作者为空,不能打赏
        //        log4net.LogHelper.WriteError(this.GetType(), new WxPayException("文章作者为空!"));
        //        throw new WxPayException("文章作者为空!");
        //    }
        //    if (looker == null)
        //    {
        //        //打赏者为空,新增用户信息(在前面获取用户信息已经跳转注册过)
        //        log4net.LogHelper.WriteError(this.GetType(), new WxPayException("获取用户信息失败!"));
        //        throw new WxPayException("获取用户信息失败!");
        //    }
        //    RewardOrder order = new RewardOrder();
        //    order.userip = Utility.Web.WebHelper.GetIP();
        //    order.addTime = DateTime.Now;
        //    order.articleId = article.Id;
        //    order.minisnsId = article.MinisnsId;
        //    order.rewardFromUserId = looker.Id;
        //    order.rewardMoney = total_fee;
        //    order.rewardToUserId = maker.Id;
        //    order.out_trade_no = out_trade_no;
        //    order.status = 0;
        //    order.percent = ((100 - WebConfigBLL.VzanRewardPercent) - new MinisnsBll().GetModel(article.MinisnsId).RewardPercent);
        //    //众筹
        //    if (article.IsGuerdon == (int)ArticleTypeEnum.Donation)
        //    {
        //        order.percent = 100 - WebConfigBLL.DonationPercent;
        //        order.rewardtype = 3;
        //    }
        //    //新增区分文章和回复类型
        //    order.rewardtype = 0;
        //    RewardOrderBLL bllorder = new RewardOrderBLL();
        //    try
        //    {
        //        orderid = Convert.ToInt32(bllorder.Add(order));
        //        if (orderid <= 0)
        //        {
        //            throw new WxPayException("打赏新增订单失败!");
        //        }
        //    }
        //    catch (Exception ex)
        //    {
        //        log4net.LogHelper.WriteError(this.GetType(), new WxPayException("插入RewardOrder失败!" + ex.Message));
        //        throw;
        //    }
        //    unifiedOrderResult = result;
        //    return result;
        //}

        ///// <summary>
        ///// 文章悬赏
        ///// </summary>
        ///// <param name="article">文章实体</param>
        ///// <returns></returns>
        //public WxPayData GetUnifiedOrderResult(PayCenterSetting setting,Article article)
        //{
        //    OAuthUserBll bll = new OAuthUserBll(article.MinisnsId.ToString());
        //    OAuthUser maker = bll.GetUserByCache(article.UserId);
        //    //ArticleType articleType = new ArticleTypeBll().GetModel(article.ArticleTypeId);
        //    //统一下单
        //    string out_trade_no = WxPayApi.GenerateOutTradeNo();//商户订单号
        //    string body = string.Empty;
        //    int paytype = 0;
        //    if (article.GuerdonMoney > 0)
        //    {
        //        body += string.Format("悬赏贴:{0}元", article.GuerdonMoney * 0.01);//商品描述
        //        paytype = 2;
        //    }
        //    if (article.payment_free > 0)
        //    {
        //        if (article.IsGuerdon == (int)ArticleTypeEnum.Pay)
        //        {
        //            body += string.Format("付费贴:{0}元", article.payment_free * 0.01);//商品描述
        //            paytype = 3;
        //        }
        //        if (article.IsGuerdon == (int)ArticleTypeEnum.Stick)
        //        {
        //            body += string.Format("置顶贴:{0}元", article.payment_free * 0.01);//商品描述
        //            paytype = 4;
        //        }
        //    }

        //    string attach = string.Empty;
        //    attach = "paytype=" + paytype + "&minisnsid=" + article.MinisnsId + "&articleid=" + article.Id + "&userid=" + article.UserId;//自带的信息

        //    //统一下单
        //    WxPayData data = new WxPayData();
        //    data.SetValue("body", body);
        //    data.SetValue("attach", attach);
        //    data.SetValue("out_trade_no", out_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", "test");
        //    data.SetValue("trade_type", "JSAPI");
        //    data.SetValue("openid", openid);

        //    WxPayData result = WxPayApi.UnifiedOrder(data, setting);

        //    if (!result.IsSet("appid") || !result.IsSet("prepay_id") || result.GetValue("prepay_id").ToString() == "")
        //    {
        //        log4net.LogHelper.WriteError(this.GetType(), new WxPayException("文章付款ID:" + article.Id + ",data:" + data.ToJson()));
        //        log4net.LogHelper.WriteError(this.GetType(), new WxPayException("result:" + result.ToJson()));
        //        log4net.LogHelper.WriteError(this.GetType(), new WxPayException("统一下单请求失败!prepay_id:" + result.GetValue("prepay_id").ToString()));
        //        throw new WxPayException("UnifiedOrder response error!");
        //    }
        //    //插入打赏记录
        //    if (maker == null)
        //    {
        //        //作者为空,不能打赏
        //        log4net.LogHelper.WriteError(this.GetType(), new WxPayException("文章作者为空!"));
        //        throw new WxPayException("文章作者为空!");
        //    }
        //    if (article.IsGuerdon == 1)
        //    {
        //        GuerdonOrder order = new GuerdonOrder();
        //        order.Addtime = DateTime.Now;
        //        order.Articleid = article.Id;
        //        order.MinisnsId = article.MinisnsId;
        //        order.GuerdonFromUserId = maker.Id;
        //        order.GuerdonMoney = article.GuerdonMoney;
        //        order.OutTradeNo = out_trade_no;
        //        order.Status = 0;
        //        order.Percent = ((100 - WebConfigBLL.VzanRewardPercent) - new MinisnsBll().GetModel(article.MinisnsId).RewardPercent);
        //        //新增区分文章和回复类型
        //        order.OperStatus = 0;
        //        GuerdonOrderBLL bllorder = new GuerdonOrderBLL();
        //        bllorder.Add(order);
        //    }
        //    unifiedOrderResult = result;
        //    return result;
        //}
        ///// <summary>
        ///// 回复打赏
        ///// </summary>
        ///// <param name="article">回复实体</param>
        ///// <returns></returns>
        //public WxPayData GetUnifiedOrderResult(PayCenterSetting setting, ArticleComment comment, OAuthUser looker, out int orderid)
        //{

        //    OAuthUserBll bll = new OAuthUserBll(comment.MinisnsId.ToString());
        //    OAuthUser maker = bll.GetUserByCache(comment.UserId);
        //    //统一下单
        //    string out_trade_no = WxPayApi.GenerateOutTradeNo();//商户订单号
        //    string body = "打赏" + (maker == null ? "匿名用户" : Utility.ReplaceSpecialChar(maker.Nickname, '?'));//商品描述
        //    string attach = "paytype=1&minisnsid=" + comment.MinisnsId + "&commentid=" + comment.Id + "&userid=" + comment.UserId + "&luserId=" + looker.Id;//自带的信息

        //    //统一下单
        //    WxPayData data = new WxPayData();
        //    data.SetValue("body", body);
        //    data.SetValue("attach", attach);
        //    data.SetValue("out_trade_no", out_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", "test");
        //    data.SetValue("trade_type", "JSAPI");

        //    data.SetValue("openid", openid);
        //    WxPayData result = WxPayApi.UnifiedOrder(data, setting);
        //    if (!result.IsSet("appid") || !result.IsSet("prepay_id") || result.GetValue("prepay_id").ToString() == "")
        //    {
        //        log4net.LogHelper.WriteError(this.GetType(), new WxPayException("文章回复实体ID" + comment.Id + ",data:" + data.ToJson()));
        //        log4net.LogHelper.WriteError(this.GetType(), new WxPayException("result:" + result.ToJson()));
        //        log4net.LogHelper.WriteError(this.GetType(), new WxPayException("统一下单请求失败!prepay_id:" + result.GetValue("prepay_id").ToString()));
        //        throw new WxPayException("UnifiedOrder response error!");
        //    }
        //    //插入打赏记录
        //    if (maker == null)
        //    {
        //        //作者为空,不能打赏
        //        log4net.LogHelper.WriteError(this.GetType(), new WxPayException("文章作者为空!"));
        //        throw new WxPayException("文章作者为空!");
        //    }
        //    if (looker == null)
        //    {
        //        //打赏者为空,新增用户信息(在前面获取用户信息已经跳转注册过)
        //        log4net.LogHelper.WriteError(this.GetType(), new WxPayException("获取用户信息失败!"));
        //        throw new WxPayException("获取用户信息失败!");
        //    }
        //    RewardOrder order = new RewardOrder();
        //    order.userip = Utility.Web.WebHelper.GetIP();
        //    order.addTime = DateTime.Now;
        //    order.articleId = comment.ArticleId;
        //    order.minisnsId = comment.MinisnsId;
        //    order.rewardFromUserId = looker.Id;
        //    order.rewardMoney = total_fee;
        //    order.rewardToUserId = maker.Id;
        //    order.out_trade_no = out_trade_no;
        //    order.status = 0;
        //    order.percent = ((100 - WebConfigBLL.VzanRewardPercent) - new MinisnsBll().GetModel(comment.MinisnsId).RewardPercent);
        //    //新增区分文章和回复类型
        //    order.rewardtype = 1;
        //    order.commentId = comment.Id;//如果是回复打赏,commentId为空
        //    RewardOrderBLL bllorder = new RewardOrderBLL();
        //    try
        //    {
        //        orderid = Convert.ToInt32(bllorder.Add(order));
        //    }
        //    catch (Exception ex)
        //    {
        //        log4net.LogHelper.WriteError(this.GetType(), new WxPayException("插入RewardOrder失败!" + ex.Message));
        //        throw;
        //    }
        //    //orderid = bllorder.GetModel(string.Format("out_trade_no='{0}'", order.out_trade_no)).Id;
        //    unifiedOrderResult = result;
        //    return result;
        //}

        ///// <summary>
        ///// 支付中心
        ///// </summary>
        ///// <param name="article">Morders订单实体</param>
        ///// <returns></returns>
        //public WxPayData GetUnifiedOrderResult(PayCenterSetting setting, Morders morder, bool livePay = false)
        //{
        //    //统一下单
        //    string out_trade_no = morder.orderno;//商户订单号
        //    if (string.IsNullOrEmpty(morder.orderno))
        //    {
        //        log4net.LogHelper.WriteError(this.GetType(), new WxPayException("统一下单失败,订单的内部订单号为空!:OrderID:" + morder.Id));
        //        throw new WxPayException("UnifiedOrder response error!");
        //    }
        //    string body = string.Empty;
        //    if (!string.IsNullOrEmpty(morder.ShowNote))
        //    {
        //        body = morder.ShowNote;
        //    }
        //    else
        //    {
        //        string paytype = string.Empty;
        //        switch (morder.OrderType)
        //        {
        //            case (int)ArticleTypeEnum.Offer:
        //                paytype = "悬赏贴";
        //                break;
        //            case (int)ArticleTypeEnum.Pay:
        //                paytype = "付费贴";
        //                break;
        //            case (int)ArticleTypeEnum.Stick:
        //                paytype = "置顶帖";
        //                break;
        //            case (int)ArticleTypeEnum.VoiceRedPacket:
        //                paytype = "语音红包";
        //                break;
        //            case (int)ArticleTypeEnum.Advert:
        //                paytype = "广告";
        //                break;
        //            case (int)ArticleTypeEnum.VoiceRedPacketRecharge:
        //                paytype = "红包充值";
        //                break;
        //            case (int)ArticleTypeEnum.LiveReward:
        //                paytype = "直播间打赏";
        //                break;
        //            case (int)ArticleTypeEnum.CashWishes:
        //                paytype = "送彩礼";
        //                break;
        //            case (int)ArticleTypeEnum.CityArticleTop:
        //            case (int)ArticleTypeEnum.CityBannerShow:
        //            case (int)ArticleTypeEnum.CityStoreTop:
        //                paytype = "同城推广";
        //                break;
        //        }
        //        body = string.Format("支付中心,{0}支付{1}元", paytype, (morder.payment_free * 0.01));//商品描述;
        //    }
        //    string attach = string.Format("paytype={0}&orderid={1}&orderno={2}&from=center", morder.OrderType, morder.Id, morder.orderno);//自带的信息
        //    //统一下单
        //    WxPayData data = new WxPayData();
        //    data.SetValue("body", body);
        //    data.SetValue("attach", attach);
        //    data.SetValue("out_trade_no", out_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", "test");
        //    data.SetValue("trade_type", "JSAPI");
        //    data.SetValue("openid", openid);

        //    WxPayData result = WxPayApi.UnifiedOrder(data, setting,60,livePay);

        //    if (!result.IsSet("appid") || !result.IsSet("prepay_id") || result.GetValue("prepay_id").ToString() == "")
        //    {
        //        log4net.LogHelper.WriteError(this.GetType(), new WxPayException("data:" + data.ToJson()));
        //        log4net.LogHelper.WriteError(this.GetType(), new WxPayException("result:" + result.ToJson()));
        //        log4net.LogHelper.WriteError(this.GetType(), new WxPayException("统一下单请求失败!prepay_id:" + result.GetValue("prepay_id").ToString()));
        //        throw new WxPayException("UnifiedOrder response error!");
        //    }
        //    unifiedOrderResult = result;
        //    return result;
        //}
        public WxPayData GetUnifiedOrderResultByCity(PayCenterSetting setting, CityMorders morder, string notify_url)
        {
            //统一下单
            string out_trade_no = morder.orderno;//商户订单号

            if (string.IsNullOrEmpty(morder.orderno))
            {
                //log4net.LogHelper.WriteError(this.GetType(), new WxPayException("统一下单失败,订单的内部订单号为空!:OrderID:" + morder.Id));
                throw new WxPayException("UnifiedOrder response error!");
            }
            string body = string.Empty;

            if (!string.IsNullOrEmpty(morder.ShowNote))
            {
                body = morder.ShowNote;
            }
            else
            {
                string paytype = string.Empty;
                switch (morder.OrderType)
                {
                case (int)ArticleTypeEnum.MiniappGoods:
                    paytype = "小程序电商模板订单";
                    break;

                case (int)ArticleTypeEnum.MiniappFoodGoods:
                    paytype = "小程序餐饮模板订单";
                    break;

                case (int)ArticleTypeEnum.MiniappSaveMoneySet:
                    paytype = "小程序餐饮储值";
                    break;

                case (int)ArticleTypeEnum.MiniappBargain:
                    paytype = "小程序砍价";
                    break;

                case (int)ArticleTypeEnum.MiniappEnt:
                    paytype = "小程序专业版";
                    break;
                }
                body = string.Format("支付中心,{0}支付{1}元", paytype, (morder.payment_free * 0.01));                                           //商品描述;
            }
            string attach = string.Format("paytype={0}&orderid={1}&orderno={2}&from=city", morder.OrderType, morder.Id, morder.orderno); //自带的信息
            //统一下单
            WxPayData data = new WxPayData();

            data.SetValue("body", body);
            data.SetValue("attach", attach);
            data.SetValue("out_trade_no", out_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", "test");
            data.SetValue("trade_type", "JSAPI");
            data.SetValue("openid", openid);
            //同城回调到同城站点
            //data.SetValue("notify_url", WebConfigBLL.citynotify_url);
            //data.SetValue("notify_url", WebConfigBLL.citynotify_url);
            data.SetValue("notify_url", notify_url);
            //log4net.LogHelper.WriteInfo(GetType(),"支付回调链接:"+ WebConfigBLL.citynotify_url);
            WxPayData result = WxPayApi.UnifiedOrder(data, setting);

            if (result != null && (!result.IsSet("appid") || !result.IsSet("prepay_id") || !result.IsSet("prepay_id")))
            {
                //log4net.LogHelper.WriteError(this.GetType(), new WxPayException("data:" + data.ToJson()));
                //log4net.LogHelper.WriteError(this.GetType(), new WxPayException("result:" + result.ToJson()));
                //log4net.LogHelper.WriteError(this.GetType(), new WxPayException("统一下单请求失败!prepay_id:" + result.GetValue("prepay_id").ToString()));
                throw new WxPayException("UnifiedOrder response error!" + "result:" + result.ToJson());
            }
            unifiedOrderResult = result;
            return(result);
        }
Ejemplo n.º 20
0
        /// <summary>
        /// 获取提现结果
        /// </summary>
        /// <param name="item"></param>
        /// <param name="code"></param>
        /// <param name="msg"></param>
        public void GetDrawCashResult(DrawCashApply item, ref int code, ref string msg, out C_UserInfo userinfo)
        {
            item.drawState = (int)DrawCashState.提现失败;
            userinfo       = C_UserInfoBLL.SingleModel.GetModel(item.userId);
            if (userinfo != null)
            {
                PayCenterSetting setting = PayCenterSettingBLL.SingleModel.GetPayCenterSetting(userinfo.appId);
                if (setting == null)
                {
                    msg = "提现失败更新提现申请记录失败PayCenterSetting为NULL";
                }
                else
                {
                    WxPayData data = new WxPayData();
                    data.SetValue("openid", userinfo.OpenId);                                  //openid
                    data.SetValue("amount", item.cashMoney);                                   //取款金额
                    data.SetValue("re_user_name", ReplaceSpecialChar(userinfo.NickName, '?')); //收款用户姓名
                    data.SetValue("desc", string.Format("{0},小程序{1}提现{2}元", ReplaceSpecialChar(userinfo.NickName, '?'), Enum.GetName(typeof(DrawCashApplyType), item.applyType), item.cashMoneyStr));
                    data.SetValue("partner_trade_no", item.partner_trade_no);                  //订单号
                    data.SetValue("spbill_create_ip", ConfigurationManager.AppSettings["IP"]); //订单号

                    WxPayData result = WxPayApi.CompanyPay(data, setting);
                    if (result != null)
                    {
                        try
                        {
                            string resultStr = result.ToJson();
                            //企业付款(客户提现),接收返回数据
                            //----------------------
                            //判断执行提现结果
                            //----------------------
                            int i = DrawResult(result, item.cashMoney, setting);
                            if (i == 1)
                            {
                                msg            = "提现成功";
                                code           = 1;
                                item.drawState = (int)DrawCashState.提现成功;
                            }
                            else if (i == -2)
                            {
                                code = -1;
                                //表示微信那边返回错误码为“SYSTEMERROR”时,一定要使用原单号重试,否则可能造成重复支付等资金风险。
                                //该提现记录不能算失败也不能算成功,维持原状等待下次提现队列
                                msg = "返回错误码为“SYSTEMERROR”等待下次提现队列提现返回结果" + resultStr;
                            }
                            else
                            {
                                code = 0;
                                msg  = result.GetValue("err_code_des").ToString();
                            }
                        }
                        catch (Exception ex)
                        {
                            msg = "提现失败发生异常" + ex.Message;
                        }
                    }
                    else
                    {
                        msg = "提现失败(证书路径不存在)";
                    }
                }
            }
            else
            {
                msg = "提现用户不存在";
            }

            item.DrawTime = DateTime.Now;
            DrawCashApplyBLL.SingleModel.Update(item, "drawState,DrawTime");
            writeLog(msg);
        }
Ejemplo n.º 21
0
        /// <summary>
        /// 统一下单
        /// </summary>
        /// <param name="inputObj">提交给统一下单API的参数</param>
        /// <param name="timeOut">超时时间</param>
        /// <returns></returns>
        public static WxPayData UnifiedOrder(WxPayData inputObj, PayCenterSetting setting, int timeOut = 60, bool livePay = false)
        {
            string url = "https://api.mch.weixin.qq.com/pay/unifiedorder";

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

            //关联参数
            if (inputObj.GetValue("trade_type").ToString() == "JSAPI" && !inputObj.IsSet("openid"))
            {
                throw new WxPayException("统一支付接口中,缺少必填参数openid!trade_type为JSAPI时,openid为必填参数!");
            }
            if (inputObj.GetValue("trade_type").ToString() == "NATIVE" && !inputObj.IsSet("product_id"))
            {
                throw new WxPayException("统一支付接口中,缺少必填参数product_id!trade_type为JSAPI时,product_id为必填参数!");
            }
            //异步通知url未设置,则使用配置文件中的url
            if (!inputObj.IsSet("notify_url") || string.IsNullOrEmpty(inputObj.GetValue("notify_url").ToString()))
            {
                inputObj.SetValue("notify_url", WxPayConfig.NOTIFY_URL);//异步通知url
            }
            if (livePay)
            {
                inputObj.SetValue("notify_url", inputObj.GetValue("notify_url").ToString().Replace("/pay/", "/live/"));//异步通知url,直播要跳到直播回调
            }
            string appid  = WxPayConfig.APPID;
            string mch_id = WxPayConfig.MCHID;
            string key    = string.Empty;

            if (setting != null && setting.Id > 0)
            {
                appid  = setting.Appid;
                mch_id = setting.Mch_id;
                key    = setting.Key;
            }
            inputObj.SetValue("appid", appid);                     //公众账号ID
            inputObj.SetValue("mch_id", mch_id);                   //商户号
            inputObj.SetValue("spbill_create_ip", WxPayConfig.IP); //终端ip
            inputObj.SetValue("nonce_str", GenerateNonceStr());    //随机字符串


            //log4net.LogHelper.WriteInfo(typeof(WxPayApi), inputObj.ToJson());
            //签名
            inputObj.SetValue("sign", inputObj.MakeSign(key));
            string xml      = inputObj.ToXml();
            string response = WxHelper.Post(xml, url, false, setting, timeOut);
            //log4net.LogHelper.WriteInfo(typeof(WxPayApi), "UnifiedOrder().response=" + response);

            WxPayData result = new WxPayData();

            result.FromXml(response);
            return(result);
        }
Ejemplo n.º 22
0
        /// <summary>
        /// 企业付款
        /// </summary>
        /// <param name="inputObj">企业付款接口的参数</param>
        /// <param name="timeOut">企业付款接口超时时间</param>
        /// <returns></returns>
        public static WxPayData CompanyPay(WxPayData inputObj, PayCenterSetting setting, int timeOut = 20)
        {
            string url    = "https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers";
            string appid  = WxPayConfig.APPID;
            string mch_id = WxPayConfig.MCHID;
            string key    = string.Empty;

            if (setting != null && setting.Id > 0)
            {
                appid  = setting.Appid;
                mch_id = setting.Mch_id;
                key    = setting.Key;
            }
            inputObj.SetValue("mch_appid", appid);                 //公众账号ID
            inputObj.SetValue("mchid", mch_id);                    //商户号
            inputObj.SetValue("spbill_create_ip", WxPayConfig.IP); //IP
            inputObj.SetValue("nonce_str", GenerateNonceStr());    //随机字符串
            inputObj.SetValue("check_name", "NO_CHECK");           //校验用户姓名,不需要校验,必选项,可选类型有:
            inputObj.SetValue("sign", inputObj.MakeSign(key));     //签名
                                                                   //NO_CHECK:不校验真实姓名
                                                                   //FORCE_CHECK:强校验真实姓名(未实名认证的用户会校验失败,无法转账)
                                                                   //OPTION_CHECK:针对已实名认证的用户才校验真实姓名(未实名认证用户不校验,可以转账成功)
                                                                   //  log4net.LogHelper.WriteInfo(typeof(CompanyPay), "用户提现请求参数:" + inputObj.ToJson());
            DrawcashResult drawresult = new DrawcashResult();

            if (setting != null)
            {
                drawresult.mch_id = setting.Mch_id;
                drawresult.appid  = setting.Appid;
            }
            //检测必填参数
            if (!inputObj.IsSet("mch_appid"))
            {
                throw new WxPayException("企业付款中,公众账号appID必填!");
            }
            if (!inputObj.IsSet("mchid"))
            {
                throw new WxPayException("企业付款中,微信支付分配的商户号mchid必填!");
            }
            if (!inputObj.IsSet("nonce_str"))
            {
                throw new WxPayException("企业付款中,随机字符串nonce_str必填!");
            }
            else
            {
                drawresult.nonce_str = inputObj.GetValue("nonce_str").ToString();
            }
            if (!inputObj.IsSet("sign"))
            {
                throw new WxPayException("企业付款中,签名sign必填!");
            }
            else
            {
                drawresult.sign = inputObj.GetValue("sign").ToString();
            }
            if (!inputObj.IsSet("partner_trade_no"))
            {
                throw new WxPayException("企业付款中,商户订单号partner_trade_no必填!");
            }
            else
            {
                drawresult.partner_trade_no = inputObj.GetValue("partner_trade_no").ToString();
            }
            if (!inputObj.IsSet("openid"))
            {
                throw new WxPayException("企业付款中,用户openid必填!");
            }
            else
            {
                drawresult.openid = inputObj.GetValue("openid").ToString();
            }
            string error = string.Empty;

            //if (new DrawBackUserBLL().CheckEnable(0, 0, drawresult.openid))
            //{
            //    throw new WxPayException("黑名单!");
            //}

            if (!inputObj.IsSet("check_name"))
            {
                throw new WxPayException("企业付款中,校验用户姓名check_name必填!");
            }
            else
            {
                drawresult.check_name = inputObj.GetValue("check_name").ToString();
            }
            if (!inputObj.IsSet("amount"))
            {
                throw new WxPayException("企业付款中,金额amount必填!");
            }
            else
            {
                drawresult.amount = Convert.ToInt32(inputObj.GetValue("amount").ToString());
            }
            if (!inputObj.IsSet("desc"))
            {
                throw new WxPayException("企业付款中,企业付款描述信息desc必填!");
            }
            else
            {
                drawresult.desc = inputObj.GetValue("desc").ToString();
                if (inputObj.GetValue("desc").ToString().Length >= 50)
                {
                    inputObj.SetValue("desc", inputObj.GetValue("desc").ToString().Substring(0, 46) + "...");
                }
            }
            if (!inputObj.IsSet("spbill_create_ip"))
            {
                throw new WxPayException("企业付款中,Ip地址spbill_create_ip必填!");
            }
            else
            {
                drawresult.spbill_create_ip = inputObj.GetValue("spbill_create_ip").ToString();
            }
            if (inputObj.IsSet("re_user_name"))
            {
                drawresult.re_user_name = inputObj.GetValue("re_user_name").ToString();
            }
            string xml = inputObj.ToXml();

            drawresult.CreateTime = DateTime.Now;
            //post之前,增加记录


            int id = Convert.ToInt32(DrawcashResultBLL.SingleModel.Add(drawresult));

            drawresult.id = id;
            //
            try
            {
                string response = WxHelper.Post(xml, url, true, setting, 30);
                if (string.IsNullOrEmpty(response))
                {
                    return(null);
                }
                WxPayData result = new WxPayData();
                result.FromXml(response, false);
                if (result != null)
                {
                    drawresult.return_code  = result.GetValue("return_code") == null ? "" : result.GetValue("return_code").ToString();
                    drawresult.return_msg   = result.GetValue("return_msg") == null ? "" : result.GetValue("return_msg").ToString();
                    drawresult.nonce_str    = result.GetValue("nonce_str") == null ? "" : result.GetValue("nonce_str").ToString();
                    drawresult.result_code  = result.GetValue("result_code") == null ? "" : result.GetValue("result_code").ToString();
                    drawresult.err_code     = result.GetValue("err_code") == null ? "" : result.GetValue("err_code").ToString();
                    drawresult.err_code_des = result.GetValue("err_code_des") == null ? "" : result.GetValue("err_code_des").ToString();
                    drawresult.payment_time = DateTime.Now;
                    drawresult.payment_no   = result.GetValue("payment_no") == null ? "" : result.GetValue("payment_no").ToString();
                    DrawcashResultBLL.SingleModel.Update(drawresult);
                }
                return(result);
            }
            catch (Exception ex)
            {
                log4net.LogHelper.WriteError(typeof(WxPayApi), new Exception("提现出现错误,错误信息:" + ex.Message));
                return(null);
            }
        }
Ejemplo n.º 23
0
        public override void ProcessNotify()
        {
            try
            {
                WxPayData notifyData = GetNotifyData();
                //检查支付结果中transaction_id是否存在
                if (!notifyData.IsSet("transaction_id") || !notifyData.IsSet("appid"))
                {
                    //若transaction_id不存在,则立即返回结果给微信支付后台
                    WxPayData res = new WxPayData();
                    res.SetValue("return_code", "FAIL");
                    res.SetValue("return_msg", "支付结果中微信订单号不存在");
                    log4net.LogHelper.WriteError(GetType(), new Exception("transaction_id不存在 : " + res.ToXml()));
                    context.Response.Write(res.ToXml());
                    context.Response.End();
                    return;
                }
                string transactionId = notifyData.GetValue("transaction_id").ToString();
                //别删该日志
                log4net.LogHelper.WriteInfo(this.GetType(), $"微信支付回调返回:{transactionId}");
                string           appid   = notifyData.GetValue("appid").ToString();
                PayCenterSetting setting = PayCenterSettingBLL.SingleModel.GetPayCenterSetting(appid);
                //增加重复回调判断
                int re = RedisUtil.Get <int>(string.Format(MemCacheKey.ProcessNotify, transactionId));
                if (re != 0)
                {
                    return;
                }
                RedisUtil.Set(string.Format(MemCacheKey.ProcessNotify, transactionId), 1, TimeSpan.FromMinutes(30));
                //查询订单,判断订单真实性
                if (!QueryOrder(transactionId, setting))
                {
                    //若订单查询失败,则立即返回结果给微信支付后台
                    WxPayData res = new WxPayData();
                    res.SetValue("return_code", "FAIL");
                    res.SetValue("return_msg", "订单查询失败");
                    log4net.LogHelper.WriteError(GetType(), new Exception("订单查询失败: " + notifyData.ToJson()));
                    context.Response.Write(res.ToXml());
                    context.Response.End();
                }
                //查询订单成功
                else
                {
                    //说付款成功:插入记录
                    //这里要注意,微信通知过来之后,15秒之内没有给微信回复处理状态,微信还会第二次,第三次通知。
                    //带过来的信息一模一样,所以这要做标志判断,万一处理过程出现问题没有给微信回复。
                    //在以后多次请求的时候避免多次进行业务处理,插入多条记录
                    PayResult result = notifyData.ToPayResult();

                    if (result == null)
                    {
                        return;
                    }

                    int id = Convert.ToInt32(PayResultBLL.SingleModel.Add(result));//插入记录,论坛,直播、有约
                    result.Id = id;
                    NotifyOper(result);
                }
            }
            catch (Exception ex)
            {
                log4net.LogHelper.WriteError(typeof(ResultNotify), ex);
            }
            finally
            {
                //最后要给微信放回接收成功数据,不然微信会连续多次发送同样请求
                WxPayData res = new WxPayData();
                res.SetValue("return_code", "SUCCESS");
                res.SetValue("return_msg", "OK");
                context.Response.Write(res.ToXml());
                context.Response.End();
            }
        }
Ejemplo n.º 24
0
        /// <summary>
        /// 测速上报
        /// </summary>
        /// <param name="interface_url">接口URL</param>
        /// <param name="timeCost">接口耗时</param>
        /// <param name="inputObj">inputObj参数数组</param>
        private static void ReportCostTime(string interface_url, int timeCost, WxPayData inputObj, PayCenterSetting setting)
        {
            //如果不需要进行上报
            if (WxPayConfig.REPORT_LEVENL == 0)
            {
                return;
            }

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

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

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

            try
            {
                Report(data, setting);
            }
            catch (WxPayException)
            {
                //不做任何处理
            }
        }