Exemplo n.º 1
0
 /**
 * 
 * 网页授权获取用户基本信息的全部过程
 * 详情请参看网页授权获取用户基本信息:http://mp.weixin.qq.com/wiki/17/c0f37d5704f0b64713d5d2c37b468d75.html
 * 第一步:利用url跳转获取code
 * 第二步:利用code去获取openid和access_token
 * 
 */
 public void GetOpenidAndAccessToken()
 {
     if (!string.IsNullOrEmpty(page.Request.QueryString["code"]))
     {
         //获取code码,以获取openid和access_token
         string code = page.Request.QueryString["code"];
         Log.Debug(this.GetType().ToString(), "Get code : " + code);
         GetOpenidAndAccessTokenFromCode(code);
     }
     else
     {
         //构造网页授权获取code的URL
         string host = page.Request.Url.Host;
         string path = page.Request.Path;
         string redirect_uri = HttpUtility.UrlEncode("http://" + host + path);
         WxPayData data = new WxPayData();
         data.SetValue("appid", Config.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();
         Log.Debug(this.GetType().ToString(), "Will Redirect to URL : " + url);
         try
         {
             //触发微信返回code码         
             page.Response.Redirect(url);//Redirect函数会抛出ThreadAbortException异常,不用处理这个异常
         }
         catch(System.Threading.ThreadAbortException ex)
         {
         }
     }
 }
Exemplo n.º 2
0
        /***
        * 退款查询完整业务流程逻辑
        * @param refund_id 微信退款单号(优先使用)
        * @param out_refund_no 商户退款单号
        * @param transaction_id 微信订单号
        * @param out_trade_no 商户订单号
        * @return 退款查询结果(xml格式)
        */
        public static string Run(string refund_id, string out_refund_no, string transaction_id, string out_trade_no)
        {
            Log.Info("RefundQuery", "RefundQuery is processing...");

            WxPayData data = new WxPayData();
            if(!string.IsNullOrEmpty(refund_id))
            {
                data.SetValue("refund_id", refund_id);//微信退款单号,优先级最高
            }
            else if(!string.IsNullOrEmpty(out_refund_no))
            {
                data.SetValue("out_refund_no", out_refund_no);//商户退款单号,优先级第二
            }
            else if(!string.IsNullOrEmpty(transaction_id))
            {
                data.SetValue("transaction_id", transaction_id);//微信订单号,优先级第三
            }
            else
            {
                data.SetValue("out_trade_no", out_trade_no);//商户订单号,优先级最低
            }

            WxPayData result = WxPayApi.RefundQuery(data);//提交退款查询给API,接收返回数据

            Log.Info("RefundQuery", "RefundQuery process complete, result : " + result.ToXml());
            return result.ToPrintStr();
        }
Exemplo n.º 3
0
        public override void ProcessNotify()
        {
            WxPayData notifyData = GetNotifyData();

            //检查openid和product_id是否返回
            if (!notifyData.IsSet("openid") || !notifyData.IsSet("product_id"))
            {
                WxPayData res = new WxPayData();
                res.SetValue("return_code", "FAIL");
                res.SetValue("return_msg", "回调数据异常");
                Log.Info(this.GetType().ToString(), "The data WeChat post is error : " + res.ToXml());
                page.Response.Write(res.ToXml());
                page.Response.End();
            }

            //调统一下单接口,获得下单结果
            string openid = notifyData.GetValue("openid").ToString();
            string product_id = notifyData.GetValue("product_id").ToString();
            WxPayData unifiedOrderResult = new WxPayData();
            try
            {
                unifiedOrderResult = UnifiedOrder(openid, product_id);
            }
            catch(Exception ex)//若在调统一下单接口时抛异常,立即返回结果给微信支付后台
            {
                WxPayData res = new WxPayData();
                res.SetValue("return_code", "FAIL");
                res.SetValue("return_msg", "统一下单失败");
                Log.Error(this.GetType().ToString(), "UnifiedOrder failure : " + res.ToXml());
                page.Response.Write(res.ToXml());
                page.Response.End();
            }

            //若下单失败,则立即返回结果给微信支付后台
            if (!unifiedOrderResult.IsSet("appid") || !unifiedOrderResult.IsSet("mch_id") || !unifiedOrderResult.IsSet("prepay_id"))
            {
                WxPayData res = new WxPayData();
                res.SetValue("return_code", "FAIL");
                res.SetValue("return_msg", "统一下单失败");
                Log.Error(this.GetType().ToString(), "UnifiedOrder failure : " + res.ToXml());
                page.Response.Write(res.ToXml());
                page.Response.End();
            }

            //统一下单成功,则返回成功结果给微信支付后台
            WxPayData data = new WxPayData();
            data.SetValue("return_code", "SUCCESS");
            data.SetValue("return_msg", "OK");
            data.SetValue("appid", Config.APPID);
            data.SetValue("mch_id", Config.MCHID);
            data.SetValue("nonce_str", WxPayApi.GenerateNonceStr());
            data.SetValue("prepay_id", unifiedOrderResult.GetValue("prepay_id"));
            data.SetValue("result_code", "SUCCESS");
            data.SetValue("err_code_des", "OK");
            data.SetValue("sign", data.MakeSign());

            Log.Info(this.GetType().ToString(), "UnifiedOrder success , send data to WeChat : " + data.ToXml());
            page.Response.Write(data.ToXml());
            page.Response.End();
        }
Exemplo n.º 4
0
        /***
         * 下载对账单完整业务流程逻辑
         * @param bill_date 下载对账单的日期(格式:20140603,一次只能下载一天的对账单)
         * @param bill_type 账单类型
         *      ALL,返回当日所有订单信息,默认值 
         *      SUCCESS,返回当日成功支付的订单 
         *      REFUND,返回当日退款订单 
         *      REVOKED,已撤销的订单 
         * @return 对账单结果(xml格式)
         */
        public static string Run(string bill_date, string bill_type)
        {
            Log.Info("DownloadBill", "DownloadBill is processing...");

            WxPayData data = new WxPayData();
            data.SetValue("bill_date", bill_date);//账单日期
            data.SetValue("bill_type", bill_type);//账单类型
            WxPayData result = WxPayApi.DownloadBill(data);//提交下载对账单请求给API,接收返回结果

            Log.Info("DownloadBill", "DownloadBill process complete, result : " + result.ToXml());
            return result.ToPrintStr();
        }
Exemplo n.º 5
0
 //查询订单
 private bool QueryOrder(string transaction_id)
 {
     WxPayData req = new WxPayData();
     req.SetValue("transaction_id", transaction_id);
     WxPayData res = WxPayApi.OrderQuery(req);
     if (res.GetValue("return_code").ToString() == "SUCCESS" &&
         res.GetValue("result_code").ToString() == "SUCCESS")
     {
         return true;
     }
     else
     {
         return false;
     }
 }
Exemplo n.º 6
0
 private WxPayData UnifiedOrder(string openId,string productId)
 {
     //统一下单
     WxPayData req = new WxPayData();
     req.SetValue("body", "test");
     req.SetValue("attach", "test");
     req.SetValue("out_trade_no", WxPayApi.GenerateOutTradeNo());
     req.SetValue("total_fee", 1);
     req.SetValue("time_start", DateTime.Now.ToString("yyyyMMddHHmmss"));
     req.SetValue("time_expire", DateTime.Now.AddMinutes(10).ToString("yyyyMMddHHmmss"));
     req.SetValue("goods_tag", "test");
     req.SetValue("trade_type", "NATIVE");
     req.SetValue("openid", openId);
     req.SetValue("product_id", productId);
     WxPayData result = WxPayApi.UnifiedOrder(req);
     return result;
 }
Exemplo n.º 7
0
        /**
        * 生成扫描支付模式一URL
        * @param productId 商品ID
        * @return 模式一URL
        */
        public string GetPrePayUrl(string productId)
        {
            Log.Info(this.GetType().ToString(), "Native pay mode 1 url is producing...");

            WxPayData data = new WxPayData();
            data.SetValue("appid", Config.APPID);//公众帐号id
            data.SetValue("mch_id", Config.MCHID);//商户号
            data.SetValue("time_stamp", WxPayApi.GenerateTimeStamp());//时间戳
            data.SetValue("nonce_str", WxPayApi.GenerateNonceStr());//随机字符串
            data.SetValue("product_id", productId);//商品ID
            data.SetValue("sign", data.MakeSign());//签名
            string str = ToUrlParams(data.GetValues());//转换为URL串
            string url = "weixin://wxpay/bizpayurl?" + str;

            Log.Info(this.GetType().ToString(), "Get native pay mode 1 url : " + url);
            return url;
        }
Exemplo n.º 8
0
        /***
        * 订单查询完整业务流程逻辑
        * @param transaction_id 微信订单号(优先使用)
        * @param out_trade_no 商户订单号
        * @return 订单查询结果(xml格式)
        */
        public static string Run(string transaction_id, string out_trade_no)
        {
            Log.Info("OrderQuery", "OrderQuery is processing...");

            WxPayData data = new WxPayData();
            if(!string.IsNullOrEmpty(transaction_id))//如果微信订单号存在,则以微信订单号为准
            {
                data.SetValue("transaction_id", transaction_id);
            }
            else//微信订单号不存在,才根据商户订单号去查单
            {
                data.SetValue("out_trade_no", out_trade_no);
            }

            WxPayData result = WxPayApi.OrderQuery(data);//提交订单查询请求给API,接收返回数据

            Log.Info("OrderQuery", "OrderQuery process complete, result : " + result.ToXml());
            return result.ToPrintStr();
        }
Exemplo n.º 9
0
        /**
        * 生成直接支付url,支付url有效期为2小时,模式二
        * @param productId 商品ID
        * @return 模式二URL
        */
        public string GetPayUrl(string productId)
        {
            Log.Info(this.GetType().ToString(), "Native pay mode 2 url is producing...");

            WxPayData data = new WxPayData();
            data.SetValue("body", "test");//商品描述
            data.SetValue("attach", "test");//附加数据
            data.SetValue("out_trade_no", WxPayApi.GenerateOutTradeNo());//随机字符串
            data.SetValue("total_fee", 1);//总金额
            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

            WxPayData result = WxPayApi.UnifiedOrder(data);//调用统一下单接口
            string url = result.GetValue("code_url").ToString();//获得统一下单接口返回的二维码链接

            Log.Info(this.GetType().ToString(), "Get native pay mode 2 url : " + url);
            return url;
        }
Exemplo n.º 10
0
        public override void ProcessNotify()
        {
            WxPayData notifyData = GetNotifyData();

            //检查支付结果中transaction_id是否存在
            if (!notifyData.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();
            }

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

            //查询订单,判断订单真实性
            if (!QueryOrder(transaction_id))
            {
                //若订单查询失败,则立即返回结果给微信支付后台
                WxPayData res = new WxPayData();
                res.SetValue("return_code", "FAIL");
                res.SetValue("return_msg", "订单查询失败");
                Log.Error(this.GetType().ToString(), "Order query failure : " + res.ToXml());
                page.Response.Write(res.ToXml());
                page.Response.End();
            }
            //查询订单成功
            else
            {
                WxPayData res = new WxPayData();
                res.SetValue("return_code", "SUCCESS");
                res.SetValue("return_msg", "OK");
                Log.Info(this.GetType().ToString(), "order query success : " + res.ToXml());
                page.Response.Write(res.ToXml());
                page.Response.End();
            }
        }
Exemplo n.º 11
0
        /// <summary>
        /// 接收从微信支付后台发送过来的数据并验证签名
        /// </summary>
        /// <returns>微信支付后台返回的数据</returns>
        public WxPayData GetNotifyData()
        {
            //接收从微信后台POST过来的数据
            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();

            LogService.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);
                LogService.Error(this.GetType().ToString(), "Sign check error : " + res.ToXml());
            }

            LogService.Info(this.GetType().ToString(), "Check sign success");
            return(data);
        }
Exemplo n.º 12
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;
        }
Exemplo n.º 13
0
        public string WxNotify()
        {
            WxPayData notify = YiWei.WeiXin.Domain.WXPay.WxNotify.GetNotify();

            //检查支付结果中transaction_id是否存在
            if (!notify.IsSet("transaction_id"))
            {
                var res = new WxPayData();
                res.SetValue("return_code", "FAIL");
                res.SetValue("return_msg", "支付结果中微信订单号不存在");
                return(res.ToXml());
            }
            //再次跟微信查询订单
            WxPayData check = WxPayApi.OrderQuery(notify.GetValue("transaction_id").ToString());

            if (check.GetValue("return_code").ToString().ToUpper() != "SUCCESS" ||
                check.GetValue("result_code").ToString().ToUpper() != "SUCCESS")
            {
                var res = new WxPayData();
                res.SetValue("return_code", "FAIL");
                res.SetValue("return_msg", "订单查询失败");
                return(res.ToXml());
            }

            decimal totalFee = decimal.Parse(notify.GetValue("total_fee").ToString());
            string  openId   = notify.GetValue("openid").ToString();
            string  orderNo  = notify.GetValue("out_trade_no").ToString();
            string  code     = notify.GetValue("attach").ToString();
            //TODO 更新状态
            //TODO 发送消息

            WxPayData result = new WxPayData();

            result.SetValue("return_code", "SUCCESS");
            result.SetValue("return_msg", "OK");
            return(result.ToXml());
        }
Exemplo n.º 14
0
        /// <summary>
        /// 接收从微信支付后台发送过来的数据并验证签名
        /// </summary>
        /// <returns>微信支付后台返回的数据</returns>
        public WxPayData GetNotifyData()
        {
            //接收从微信后台POST过来的数据
            System.IO.Stream s = System.Web.HttpContext.Current.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();

            PayLogHelper.Debug("WX:" + 1111);

            //转换数据格式并验证签名
            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);
                PayLogHelper.Debug("WX:若签名错误" + "Sign check error : " + res.ToXml());
            }
            PayLogHelper.Debug("WX:Check sign success");
            return(data);
        }
Exemplo n.º 15
0
        public RefundReturn Refund(string transaction_id, string out_trade_no, string total_fee, string refund_fee)
        {
            WxPayData data = new WxPayData();

            if (!string.IsNullOrEmpty(transaction_id))//微信订单号存在的条件下,则已微信订单号为准
            {
                data.SetValue("transaction_id", transaction_id);
            }
            else//微信订单号不存在,才根据商户订单号去退款
            {
                data.SetValue("out_trade_no", out_trade_no);
            }

            data.SetValue("total_fee", int.Parse(total_fee));              //订单总金额
            data.SetValue("refund_fee", int.Parse(refund_fee));            //退款金额
            data.SetValue("out_refund_no", WxPayApi.GenerateOutTradeNo()); //随机生成商户退款单号
            data.SetValue("op_user_id", WxPayConfig.MCHID);                //操作员,默认为商户号
            WxPayData result = WxPayApi.Refund(data);                      //提交退款申请给API,接收返回数据

            RefundReturn refreturn   = new RefundReturn();
            string       result_code = result.GetValue("result_code").ToString();

            if (result_code == "SUCCESS")
            {
                refreturn.ResultCode = result_code;
                refreturn.ErrCode    = "";
                refreturn.ErrCodeDes = "";
            }
            else
            {
                refreturn.ResultCode = result_code;
                refreturn.ErrCode    = result.GetValue("err_code").ToString();
                refreturn.ErrCodeDes = result.GetValue("err_code_des").ToString();
            }

            return(refreturn);
        }
Exemplo n.º 16
0
        public WxPayQueryResult(WxPayData Data)
        {
            return_code = Data.GetValue("return_code")?.ToString();
            return_msg  = Data.GetValue("return_msg")?.ToString();

            //==========以下字段在return_code为SUCCESS的时候有返回==========//
            if (return_code == "SUCCESS")
            {
                appid        = Data.GetValue("appid")?.ToString();
                mch_id       = Data.GetValue("mch_id")?.ToString();
                nonce_str    = Data.GetValue("nonce_str")?.ToString();
                sign         = Data.GetValue("sign")?.ToString();
                result_code  = Data.GetValue("result_code")?.ToString();
                err_code     = Data.GetValue("err_code")?.ToString();
                err_code_des = Data.GetValue("err_code_des")?.ToString();

                //===========以下字段在return_code 、result_code、trade_state都为SUCCESS时有返回 ,如trade_state不为 SUCCESS,则只返回out_trade_no(必传)和attach(选传)。====//
                if (result_code == "SUCCESS")
                {
                    device_info      = Data.GetValue("device_info")?.ToString();
                    openid           = Data.GetValue("openid")?.ToString();
                    is_subscribe     = Data.GetValue("is_subscribe")?.ToString();
                    trade_type       = Data.GetValue("trade_type")?.ToString();
                    trade_state      = Data.GetValue("trade_state")?.ToString();
                    bank_type        = Data.GetValue("bank_type")?.ToString();
                    fee_type         = Data.GetValue("fee_type")?.ToString();
                    cash_fee_type    = Data.GetValue("cash_fee_type")?.ToString();
                    total_fee        = Convert.ToInt32(Data.GetValue("total_fee") ?? 0);
                    cash_fee         = Convert.ToInt32(Data.GetValue("cash_fee") ?? 0);
                    out_trade_no     = Data.GetValue("out_trade_no").ToString();
                    transaction_id   = Data.GetValue("transaction_id")?.ToString();
                    time_end         = Data.GetValue("time_end")?.ToString();
                    attach           = Data.GetValue("attach")?.ToString();
                    trade_state_desc = Data.GetValue("trade_state_desc")?.ToString();
                }
            }
        }
Exemplo n.º 17
0
 /**
  *
  * 网页授权获取用户基本信息的全部过程
  * 详情请参看网页授权获取用户基本信息:http://mp.weixin.qq.com/wiki/17/c0f37d5704f0b64713d5d2c37b468d75.html
  * 第一步:利用url跳转获取code
  * 第二步:利用code去获取openid和access_token
  *
  */
 public void GetOpenidAndAccessToken()
 {
     Log.Debug(this.GetType().ToString(), "code : " + page.Request.QueryString["code"]);
     if (!string.IsNullOrEmpty(page.Request.QueryString["code"]))
     {
         //获取code码,以获取openid和access_token
         string code = page.Request.QueryString["code"];
         Log.Debug(this.GetType().ToString(), "Get code : " + code);
         //  Log.Debug(this.GetType().ToString(), "Get returnUrl : " + page.Request.QueryString["returnUrl"]);
         GetOpenidAndAccessTokenFromCode(code);
     }
     else
     {
         //构造网页授权获取code的URL
         string    host         = page.Request.Url.Host;
         string    path         = page.Request.Url.PathAndQuery;
         string    redirect_uri = "http://" + host + path;// HttpUtility.UrlEncode(page.Request.Url.AbsoluteUri);
         WxPayData data         = new WxPayData();
         data.SetValue("appid", WxPayConfig.APPID);
         data.SetValue("redirect_uri", redirect_uri);
         data.SetValue("response_type", "code");
         data.SetValue("scope", "snsapi_base");
         data.SetValue("state", "STATE" + "#wechat_redirect");
         //   data.SetValue("returnUrl", "http://www.sina.com/order/");
         string url = "https://open.weixin.qq.com/connect/oauth2/authorize?" + data.ToUrl();
         Log.Debug(this.GetType().ToString(), "Will Redirect to URL : " + url);
         try
         {
             //触发微信返回code码
             page.Response.Redirect(url);//Redirect函数会抛出ThreadAbortException异常,不用处理这个异常
         }
         catch (System.Threading.ThreadAbortException ex)
         {
             Log.Error(this.GetType().ToString(), ex.GetType().Name + ex.Message);
         }
     }
 }
Exemplo n.º 18
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);
    }
Exemplo n.º 19
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);
    }
Exemplo n.º 20
0
        /**
         * 调用统一下单,获得下单结果
         * @return 统一下单结果
         * @失败时抛异常WxPayException
         */
        private string GetUnifiedOrderResult(PayInfo info)
        {
            string subject;
            string body;

            PayHelper.GetSubjectAndBody(info, out subject, out body);

            //统一下单
            WxPayData data = new WxPayData();

            data.SetValue("body", subject);
            data.SetValue("out_trade_no", info.BillId);
            //金额单位分
            data.SetValue("total_fee", (int)info.PayAmount * 100);
            data.SetValue("time_start", DateTime.Now.ToString("yyyyMMddHHmmss"));
            data.SetValue("time_expire", DateTime.Now.AddMinutes(10).ToString("yyyyMMddHHmmss"));
            data.SetValue("trade_type", "APP");

            WxPayData result = WxPayApi.UnifiedOrder(data);

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

            //客户端调起支付接口需要参数
            WeixinPayReq req = new WeixinPayReq();

            req.Appid     = result.GetValue("appid").ToString();
            req.Partnerid = result.GetValue("mch_id").ToString();
            req.Prepayid  = result.GetValue("prepay_id").ToString();
            req.Noncestr  = WxPayAPI.WxPayApi.GenerateNonceStr();
            req.Timestamp = WxPayAPI.WxPayApi.GenerateTimeStamp();
            req.Sign      = MakeSecondSign(req);

            return(JsonConvert.SerializeObject(req));
        }
Exemplo n.º 21
0
        public override void ProcessNotify()
        {
            WxPayData notifyData = GetNotifyData();

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

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

            //查询订单,判断订单真实性
            if (!QueryOrder(transaction_id))
            {
                //若订单查询失败,则立即返回结果给微信支付后台
                WxPayData res = new WxPayData();
                res.SetValue("return_code", "FAIL");
                res.SetValue("return_msg", "订单查询失败");
                Response.Write(res.ToXml());
                Response.End();
            }
            //查询订单成功
            else
            {
                WxPayData res = new WxPayData();
                res.SetValue("return_code", "SUCCESS");
                res.SetValue("return_msg", "OK");
                Response.Write(res.ToXml());
                Response.End();
            }
        }
Exemplo n.º 22
0
        public override PayOrder CompletePayOrder(object obj)
        {
            WxPayData wxPayData = (WxPayData)obj;
            PayOrder  payOrder  = FindPayOrder(wxPayData);

            if (payOrder != null && payOrder.Success == false)
            {
                Player player = _playerService.FindPlayerByName(payOrder.WeixinName);
                //IstoreHouse.GetPlayerByName(payOrder.WeixinName);
                try
                {
                    //  player_.Account.Addmount(payOrder.Amount, "充值");
                    _playerService.AdjustAccount(player, payOrder.Amount, "充值");
                    if (ManagePlayer.GetOnlyInstance().WeixinName == player.IntroducerWeixinName && payOrder.Amount <= 100)
                    {
                        _playerService.AdjustAccount(player, payOrder.Amount * (decimal)0.02, "随机奖励");
                    }
                    else
                    {
                        Player introducer = _playerService.FindPlayerByName(player.IntroducerWeixinName);
                        //IstoreHouse.GetPlayerByName(player_.IntroducerWeixinName);
                        _playerService.AdjustAccount(introducer, payOrder.Amount * (decimal)0.02, "分享奖励");
                    }
                    payOrder.Success = true;
                    _storeHouse.SaveChanges();
                    //IstoreHouse.SaveChanges();
                }
                catch (Exception)
                {
                    _logger.LogInformation("rechargeError:out_trade_no:"
                                           + payOrder.Out_trade_no +
                                           "_weixinName:" + payOrder.WeixinName +
                                           "_amount:" + payOrder.Amount);
                }
            }
            return(payOrder);
        }
Exemplo n.º 23
0
 protected void Page_Load(object sender, EventArgs e)
 {
     if (!IsPostBack)
     {
         if (!string.IsNullOrEmpty(Request.QueryString["code"]))
         {
             //获取code码,以获取openid和access_token
             string code = Request.QueryString["code"];
             Log.Debug(this.GetType().ToString(), "Get code : " + code);
             GetOpenidAndAccessTokenFromCode(code);
         }
         else
         {
             //构造网页授权获取code的URL
             string    host         = Request.Url.Host;
             string    path         = Request.Path;
             string    redirect_uri = HttpUtility.UrlEncode("http://" + host + path);
             WxPayData data         = new WxPayData();
             data.SetValue("appid", WxPayConfig.APPID);
             data.SetValue("redirect_uri", redirect_uri);
             data.SetValue("response_type", "code");
             data.SetValue("scope", "snsapi_userinfo");
             data.SetValue("state", "STATE" + "#wechat_redirect");
             string url = "https://open.weixin.qq.com/connect/oauth2/authorize?" + data.ToUrl();
             Log.Debug(this.GetType().ToString(), "Will Redirect to URL : " + url);
             try
             {
                 //触发微信返回code码
                 Response.Redirect(url);//Redirect函数会抛出ThreadAbortException异常,不用处理这个异常
             }
             catch (System.Threading.ThreadAbortException ex)
             {
             }
         }
     }
 }
Exemplo n.º 24
0
        public string SearchBankOrder(string CommunityId, string out_trade_no)
        {
            string Result = "";

            WxPayConfig wxPayConfig = GenerateConfig(CommunityId);

            IDbConnection        conn    = new SqlConnection(GetConnection(CommunityId));
            string               query   = "SELECT * FROM Tb_OL_WeiXinPayOrder WHERE out_trade_no=@out_trade_no";
            Tb_OL_WeiXinPayOrder T_Order = conn.Query <Tb_OL_WeiXinPayOrder>(query, new { out_trade_no = out_trade_no }).SingleOrDefault();

            if (T_Order == null)
            {
                Result = "未找到该物业订单";
                return(Result);
            }

            WxPayData data = new WxPayData();

            data.SetValue("out_trade_no", out_trade_no);
            WxPayData BankResult = WxPayApi.OrderQuery(data);//提交订单查询请求给API,接收返回数据

            Result = BankResult.GetValue("trade_state").ToString();
            return(Result);
        }
        /// <summary>
        /// 实名认证 回调
        /// </summary>
        /// <returns></returns>
        public ViewResult Paycallback()
        {
            var       notify      = new Notify(this.Request);
            var       res         = notify.GetNotifyData();
            string    return_code = res.GetValue("return_code").ToString();
            string    result_code = res.GetValue("result_code").ToString();
            WxPayData wres        = new WxPayData();

            if (return_code.iEquals("success") && return_code.iEquals("success"))
            {
                var openid   = res.GetValue("openid").ToString();
                var bus      = new Bus(this.DataSource);
                var userinfo = bus.GetUserInfo(openid, WxPayConfig.APPID(""));
                if (userinfo != null)
                {
                    userinfo.RNameChecked = 1;
                    userinfo.DataDriver   = this.DataSource;
                    userinfo.Store();
                }
            }
            wres.SetValue("return_code", "SUCCESS");
            wres.SetValue("return_msg", "回调成功");
            return(View("callback", wres));
        }
Exemplo n.º 26
0
        /// <summary>
        /// 统一下单接口
        /// </summary>
        /// <param name="unifiedorderModel">请求参数</param>
        /// <returns></returns>
        public static UnifiedOrderResponseModel UnifiedOrder(UnifiedOrderModel unifiedorderModel)
        {
            UnifiedOrderResponseModel response = new UnifiedOrderResponseModel();
            WxPayData data = new WxPayData();

            data.SetValue("body", unifiedorderModel.body);                                        //商品描述
            data.SetValue("attach", unifiedorderModel.attach);                                    //附加数据
            data.SetValue("out_trade_no", WxPayApi.GenerateOutTradeNo());                         //随机字符串
            data.SetValue("total_fee", unifiedorderModel.total_fee);                              //总金额
            data.SetValue("time_start", DateTime.Now.ToString("yyyyMMddHHmmss"));                 //交易起始时间
            data.SetValue("time_expire", DateTime.Now.AddMinutes(10).ToString("yyyyMMddHHmmss")); //交易结束时间
            data.SetValue("goods_tag", unifiedorderModel.goods_tag);                              //商品标记
            data.SetValue("trade_type", unifiedorderModel.trade_type);                            //交易类型
            data.SetValue("product_id", unifiedorderModel.product_id);                            //商品ID
            LogUtil.WriteWxpayLog("统一下单请求", "请求参数", data.ToJson());
            WxPayData result    = WxPayApi.UnifiedOrder(data);                                    //调用统一下单接口
            string    resultStr = result.ToJson();

            LogUtil.WriteWxpayLog("统一下单响应", "响应参数", resultStr);
            response = LitJson.JsonMapper.ToObject <UnifiedOrderResponseModel>(resultStr);
            response.out_trade_no = response.out_trade_no ?? data.GetValue("out_trade_no").ToString();
            return(response);
            //Log.Info(this.GetType().ToString(), "Get native pay mode 2 url : " + url);
        }
Exemplo n.º 27
0
        public string GetPayUrl(string productId)
        {
            DataBase.DbHelperSQL.WriteLog("进入GetPayUrl方法", new Exception());
            string url   = null;
            Orders order = bugService.GetOrderById(Convert.ToInt32(productId));

            WxPayData data = new WxPayData();

            data.SetValue("body", "ABC在线课程");                                     //商品描述
            //data.SetValue("attach", "test");//附加数据
            data.SetValue("out_trade_no", productId);                             //随机字符串
            data.SetValue("total_fee", Convert.ToInt32(order.TotalAmount * 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
            WxPayData result = null;

            try
            {
                result = WxPayApi.UnifiedOrder(data);            //调用统一下单接口
                url    = result.GetValue("code_url").ToString(); //获得统一下单接口返回的二维码链接
            }
            catch (Exception)
            {
                result = WxPayApi.UnifiedOrder(data);            //调用统一下单接口
                url    = result.GetValue("code_url").ToString(); //获得统一下单接口返回的二维码链接
            }



            DataBase.DbHelperSQL.WriteLog("生成图片路径url:" + url, new Exception());

            return(url);
        }
Exemplo n.º 28
0
        /**
         *
         * 通过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)
        {
            Log.Debug(this.GetType().ToString(), "GetOpenidAndAccessTokenFromCode");
            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");
                Log.Debug(this.GetType().ToString(), "get openid Url : " + data.ToUrl());
                string url = "https://api.weixin.qq.com/sns/oauth2/access_token?" + data.ToUrl();

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

                Log.Debug(this.GetType().ToString(), "GetOpenidAndAccessTokenFromCode response : " + result);

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

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

                Log.Debug(this.GetType().ToString(), "Get openid : " + openid);
                Log.Debug(this.GetType().ToString(), "Get access_token : " + access_token);
            }
            catch (Exception ex)
            {
                Log.Error(this.GetType().ToString(), ex.ToString());
                throw new WxPayException(ex.ToString());
            }
        }
        //
        // GET: /WeixinPayBackUrl/

        /// <summary>
        /// 微信支付回调地址
        /// add by fruitchan
        /// 2017-1-18 21:10:30
        /// </summary>
        /// <returns>Content</returns>
        public ActionResult Index()
        {
            WxPayData res = new WxPayData();

            res.SetValue("return_code", "FAIL");
            res.SetValue("return_msg", "业务异常");

            WxPayData notifyData = GetNotifyData();

            if (!notifyData.IsSet("return_code"))
            {
                res.SetValue("return_code", "FAIL");
                res.SetValue("return_msg", "回调数据异常");
                Log.Info(this.GetType().ToString(), "The data WeChat post is error : " + res.ToXml());
                return(Content(res.ToXml()));
            }
            else
            {
                string return_code = notifyData.GetValue("return_code").ToString();
                string result_code = notifyData.GetValue("result_code").ToString();

                if (return_code == "SUCCESS" && result_code == "SUCCESS")
                {
                    string out_trade_no   = notifyData.GetValue("out_trade_no").ToString();
                    string transaction_id = notifyData.GetValue("transaction_id").ToString();

                    // 处理订单
                    UpdateOrderState(out_trade_no, transaction_id);

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

            return(Content(res.ToXml()));
        }
Exemplo n.º 30
0
        /**
         * 生成直接支付url,支付url有效期为2小时,模式二
         * @param productId 商品ID
         * @return 模式二URL
         */
        public string GetPayUrl(string productId)
        {
            Log <T> .Info(this.GetType().ToString(), "Native pay mode 2 url is producing...");

            WxPayData <T> data = new WxPayData <T>();

            data.SetValue("body", "账户充值");                                                        //商品描述
            data.SetValue("attach", "账户充值");                                                      //附加数据
            data.SetValue("out_trade_no", WxPayApi <T> .GenerateOutTradeNo());                    //随机字符串
            data.SetValue("total_fee", 1);                                                        //总金额
            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

            WxPayData <T> result = WxPayApi <T> .UnifiedOrder(data);                              //调用统一下单接口

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

            Log <T> .Info(this.GetType().ToString(), "Get native pay mode 2 url : " + url);

            return(url);
        }
        /// <summary>
        /// 支付结果回调地址
        /// </summary>
        /// <returns></returns>
        public string PayNotifyUrl()
        {
            WxPayData resultInfo = new WxPayData();

            try
            {
                ResultNotify resultNotify       = new ResultNotify();
                WxPayData    notifyData         = resultNotify.GetNotifyData(); //获取微信返回的数据
                string       accessToken        = WeChatTools.GetAccessoken();
                var          userInfoStr        = WeChatTools.ConvertToUserIdByOpenid(accessToken, notifyData.GetValue("openid").ToString());
                var          userInfo           = Common.JsonHelper.JsonToModel <U_WechatUserInfo>(userInfoStr);
                var          userid             = userInfo.userid;
                var          personInfoModel    = _wl.GetUserInfo(userid);   //获取人员表信息
                var          paymentHistoryInfo = new Business_PaymentHistory_Information();
                paymentHistoryInfo.PaymentPersonnel = personInfoModel.Vguid; //付款人vguid
                _weChatRevenueLogic.UpdatePaymentHistory(personInfoModel, paymentHistoryInfo, notifyData);

                if (notifyData.GetValue("return_code").ToString() == "SUCCESS" && notifyData.GetValue("result_code").ToString() == "SUCCESS")
                {
                    resultInfo.SetValue("return_code", "SUCCESS");
                    resultInfo.SetValue("return_msg", "OK");
                }
                else
                {
                    resultInfo.SetValue("return_code", notifyData.GetValue("return_code").ToString());
                    resultInfo.SetValue("return_msg", notifyData.GetValue("return_msg").ToString());
                }
            }
            catch (Exception ex)
            {
                LogHelper.WriteLog(ex.ToString());
                resultInfo.SetValue("return_code", "FAIL");
                resultInfo.SetValue("return_msg", "交易失败");
            }
            return(resultInfo.ToXml());
        }
Exemplo n.º 32
0
        /// <summary>
        /// 退款查询完整业务流程逻辑
        /// </summary>
        /// <param name="refund_id">微信退款单号(优先使用)</param>
        /// <param name="out_refund_no">商户退款单号</param>
        /// <param name="transaction_id">微信订单号</param>
        /// <param name="out_trade_no">商户订单号</param>
        /// <returns>退款查询结果(xml格式)</returns>
        public static string Run(string refund_id, string out_refund_no, string transaction_id, string out_trade_no)
        {
            WxPayData data = new WxPayData();

            if (!string.IsNullOrEmpty(refund_id))
            {
                data.SetValue("refund_id", refund_id);//微信退款单号,优先级最高
            }
            else if (!string.IsNullOrEmpty(out_refund_no))
            {
                data.SetValue("out_refund_no", out_refund_no);//商户退款单号,优先级第二
            }
            else if (!string.IsNullOrEmpty(transaction_id))
            {
                data.SetValue("transaction_id", transaction_id);//微信订单号,优先级第三
            }
            else
            {
                data.SetValue("out_trade_no", out_trade_no); //商户订单号,优先级最低
            }
            WxPayData result = WxPayAPI2.RefundQuery(data);  //提交退款查询给API,接收返回数据

            return(result.ToPrintStr());
        }
Exemplo n.º 33
0
        /**
         *
         * 通过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 async Task GetOpenidAndAccessTokenFromCodeAsync(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 = await HttpService.Get(url);

                Log.Debug(this.GetType().ToString(), "GetOpenidAndAccessTokenFromCode response : " + result);

                var jd = Newtonsoft.Json.JsonConvert.DeserializeObject <JsonData>(result);

                if (jd.errcode == 0)
                {
                    access_token = jd.access_token;

                    //获取用户openid
                    openid = jd.openid;
                }


                Log.Debug(this.GetType().ToString(), "Get openid : " + openid);
                Log.Debug(this.GetType().ToString(), "Get access_token : " + access_token);
            }
            catch (Exception ex)
            {
                Log.Error(this.GetType().ToString(), ex.ToString());
            }
        }
Exemplo n.º 34
0
        private void CheckData(WxPayData notifyData)
        {
            WxPayData res = new WxPayData();

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

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

            Log.Info("支付订单信息", notifyData.GetValue("attach").ToString());
            //填写自己的逻辑判断  a[0]订单号, a[1]酒店id , a[2]会员卡支付
            string[] a            = notifyData.GetValue("attach").ToString().Split(',');
            string   AdminHotelid = "";
            int      Hotelid      = 0;

            AdminHotelid = a[1];
            if (a[2] == "客房预订" || a[2] == "客房续住" || a.Length > 3)
            {
                Hotelid = CommonHelper.GetInt(a[3]);
            }

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

            if (a[2] == "客房预订")
            {
                wxzf(a, transaction_id, CommonHelper.GetInt(notifyData.GetValue("total_fee").ToString()) / 100);
            }
        }
Exemplo n.º 35
0
        /**
         *
         * 查询订单情况
         * @param string out_trade_no  商户订单号
         * @param int succCode         查询订单结果:0表示订单不成功,1表示订单成功,2表示继续查询
         * @return 订单查询接口返回的数据,参见协议接口
         */
        public WxPayData Query(string out_trade_no, out int succCode)
        {
            WxPayData queryOrderInput = new WxPayData();

            queryOrderInput.SetValue("out_trade_no", out_trade_no);
            WxPayData result = WxPayApi.OrderQuery(queryOrderInput);

            if (result.GetValue("return_code").ToString() == "SUCCESS" &&
                result.GetValue("result_code").ToString() == "SUCCESS")
            {
                //支付成功
                if (result.GetValue("trade_state").ToString() == "SUCCESS")
                {
                    succCode = 1;
                    return(result);
                }
                //用户支付中,需要继续查询
                else if (result.GetValue("trade_state").ToString() == "USERPAYING")
                {
                    succCode = 2;
                    return(result);
                }
            }

            //如果返回错误码为“此交易订单号不存在”则直接认定失败
            if (result.GetValue("err_code").ToString() == "ORDERNOTEXIST")
            {
                succCode = 0;
            }
            else
            {
                //如果是系统错误,则后续继续
                succCode = 2;
            }
            return(result);
        }
Exemplo n.º 36
0
        private string GetOpenid(string code)
        {
            string openid = string.Empty;

            try
            {
                //构造获取openid及access_token的url
                WxPayData data = new WxPayData();
                data.SetValue("appid", Session["appid"]);
                data.SetValue("secret", Session["appsecret"]);
                data.SetValue("code", code);
                data.SetValue("grant_type", "authorization_code");
                string url = "https://api.weixin.qq.com/sns/oauth2/access_token?" + data.ToUrl();

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

                Log.Debug(this.GetType().ToString(), "GetOpenidAndAccessTokenFromCode response : " + result);

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

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

                Log.Debug(this.GetType().ToString(), "Get openid : " + openid);

                return(openid);
            }
            catch (Exception ex)
            {
                Log.Error(this.GetType().ToString(), ex.ToString());
                //throw new Exception(ex.ToString());
                return("");
            }
        }
Exemplo n.º 37
0
        public static string wxPayOrderQuery(string out_trade_no, string appid, string mchid)
        {
            WxPayData data = new WxPayData();

            if (!string.IsNullOrEmpty(out_trade_no))//如果微信订单号存在,则以微信订单号为准
            {
                data.SetValue("out_trade_no", out_trade_no);
            }
            else
            {
                throw new WxPayException("订单查询接口中,out_trade_no填一个!");
            }

            WxPayData result = WxPayApi.OrderQuery(data, appid, mchid);//提交订单查询请求给API,接收返回数据

            if (result.IsSet("result_code") && result.GetValue("result_code").ToString() == "SUCCESS" && result.IsSet("trade_state") && result.GetValue("trade_state").ToString() == "SUCCESS")
            {
                return(result.GetValue("time_end").ToString());
            }
            else
            {
                return(null);
            }
        }
Exemplo n.º 38
0
        /***
        * 申请退款完整业务流程逻辑
        * @param transaction_id 微信订单号(优先使用)
        * @param out_trade_no 商户订单号
        * @param total_fee 订单总金额
        * @param refund_fee 退款金额
        * @return 退款结果(xml格式)
        */
        public static string Run(string transaction_id, string out_trade_no, string total_fee, string refund_fee)
        {
            Log.Info("Refund", "Refund is processing...");

            WxPayData data = new WxPayData();
            if (!string.IsNullOrEmpty(transaction_id))//微信订单号存在的条件下,则已微信订单号为准
            {
                data.SetValue("transaction_id", transaction_id);
            }
            else//微信订单号不存在,才根据商户订单号去退款
            {
                data.SetValue("out_trade_no", out_trade_no);
            }

            data.SetValue("total_fee", int.Parse(total_fee));//订单总金额
            data.SetValue("refund_fee", int.Parse(refund_fee));//退款金额
            data.SetValue("out_refund_no", WxPayApi.GenerateOutTradeNo());//随机生成商户退款单号
            data.SetValue("op_user_id", Config.MCHID);//操作员,默认为商户号

            WxPayData result = WxPayApi.Refund(data);//提交退款申请给API,接收返回数据

            Log.Info("Refund", "Refund process complete, result : " + result.ToXml());
            return result.ToPrintStr();
        }
Exemplo n.º 39
0
        private bool QueryOrder(string transactionId)
        {
            var config = _configService.Get <WeiXinConfig>();

            WeiXinPayConfig weiXinPayConfig = new WeiXinPayConfig()
            {
                APPID = config.AppId, MCHID = config.MchId, KEY = config.Key
            };

            WxPayData req = new WxPayData();

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

            if (res.GetValue("return_code").ToString() == "SUCCESS" &&
                res.GetValue("result_code").ToString() == "SUCCESS")
            {
                return(true);
            }
            else
            {
                return(false);
            }
        }
Exemplo n.º 40
0
        public static WxPayData GenerateUnifiedWxPayData(
            this OrderContext context,
            string mchid,
            string outTradeNo,
            string payKey,
            string noceStr,
            string signature)
        {
            var data = new WxPayData()
            {
                AppId          = context.AppId,
                TimeStart      = DateTime.Now.ToString("yyyyMMddHHmmss"),
                TimeExpire     = DateTime.Now.AddMinutes(10).ToString("yyyyMMddHHmmss"), //"20180905091412"; //
                Body           = "购买商品",
                Attach         = signature,
                OutTradeNo     = outTradeNo,
                GoodsTag       = "奶茶饮品",
                TradeType      = "JSAPI",
                MchId          = mchid,
                Totalfee       = context.Money,
                NotifyUrl      = "https://www.yourc.club/api/sharing/PayNotify",
                SpbillCreateIp = "118.24.139.228",
                NonceStr       = noceStr,
                SignType       = WxPayData.SIGN_TYPE_HMAC_SHA256,
                OpenId         = context.OpenId
                                 //   SceneInfo = "{'h5_info': {'type':'Miniprogarm','app_name': '利群奶茶店','package_name': 'com.tencent.tmgp.sgame'}}"
            };

            data.Sign = data.MakeSign(payKey);

            if (data.WithRequired(out string errMsg) == false)
            {
                throw new WeChatPayException(errMsg);
            }
            return(data);
        }
Exemplo n.º 41
0
        /// <summary>
        /// 检查订单状态
        /// </summary>
        /// <param name="parameter"></param>
        /// <param name="config"></param>
        /// <returns>只要有结果,无论成功或者失败,返回true,不确定支付结果返回false</returns>
        bool checkPayStateByConfig(PayParameter parameter, WxPayConfig config)
        {
            try
            {
                WxPayData queryOrderInput = new WxPayData();
                queryOrderInput.SetValue("out_trade_no", parameter.TradeID);
                WxPayData result = WxPayApi.OrderQuery(queryOrderInput, config);
                string    xml    = result.ToXml();

                PayFactory.OnLog(parameter.TradeID, xml);
                if (result.GetValue("return_code").ToString() == "SUCCESS" &&
                    result.GetValue("result_code").ToString() == "SUCCESS")
                {
                    //支付成功
                    if (result.GetValue("trade_state").ToString() == "SUCCESS")
                    {
                        //触发回调函数
                        PayFactory.OnPaySuccessed(parameter.TradeID, result.ToXml());
                        return(true);
                    }
                    //用户支付中,需要继续查询
                    else if (result.GetValue("trade_state").ToString() == "USERPAYING")
                    {
                        return(false);
                    }
                    else if (result.GetValue("trade_state").ToString() == "NOTPAY")
                    {
                        //触发回调函数
                        PayFactory.OnPayFailed(parameter.TradeID, "放弃支付", xml);
                        return(true);
                    }
                }

                string returnMsg = result.GetValue("err_code_des").ToSafeString();
                if (string.IsNullOrEmpty(returnMsg))
                {
                    returnMsg = result.GetValue("return_msg").ToSafeString();
                }

                //如果返回错误码为“此交易订单号不存在”,直接失败
                if (result.GetValue("err_code").ToString() == "ORDERNOTEXIST")
                {
                    //触发回调函数
                    PayFactory.OnPayFailed(parameter.TradeID, returnMsg, xml);
                    return(true);
                }
                else if (result.GetValue("err_code").ToString() == "SYSTEMERROR")
                {
                    //如果是系统错误,则后续继续
                    return(false);
                }
                else if (result.GetValue("return_code").ToString() == "FAIL" ||
                         result.GetValue("result_code").ToString() == "FAIL")
                {
                    //FAIL
                    //触发回调函数
                    PayFactory.OnPayFailed(parameter.TradeID, returnMsg, xml);
                    return(true);
                }
            }
            catch
            {
            }
            return(false);
        }
Exemplo n.º 42
0
        public virtual string StartPay(PayParameter parameter)
        {
            try
            {
                WxPayConfig config = new WxPayAPI.WxPayConfig(PayFactory.GetInterfaceXmlConfig(PayInterfaceType.WeiXinBarcode, parameter.TradeID));
                WxPayData   data   = new WxPayData();
                data.SetValue("auth_code", parameter.AuthCode);                                                   //授权码
                data.SetValue("body", parameter.TradeName == null ? parameter.Description : parameter.TradeName); //商品描述
                data.SetValue("total_fee", Convert.ToInt32(parameter.Amount * 100));                              //总金额,以分为单位
                data.SetValue("out_trade_no", parameter.TradeID);                                                 //产生随机的商户订单号

                WxPayData result = WxPayApi.Micropay(data, config, 20);                                           //提交被扫支付,接收返回结果
                string    xml    = result.ToXml();
                PayFactory.OnLog(parameter.TradeID, xml);
                string returnMsg = result.IsSet("return_msg") ? result.GetValue("return_msg").ToSafeString() : result.GetValue("err_code_des").ToSafeString();
                //如果提交被扫支付接口调用失败,则抛异常
                if (!result.IsSet("return_code") || result.GetValue("return_code").ToString() == "FAIL")
                {
                    //触发回调函数
                    PayFactory.OnPayFailed(parameter.TradeID, returnMsg, xml);
                    return(null);
                }

                //签名验证
                result.CheckSign(config);


                //刷卡支付直接成功
                if (result.GetValue("return_code").ToString() == "SUCCESS" &&
                    result.GetValue("result_code").ToString() == "SUCCESS")
                {
                    //触发回调函数
                    PayFactory.OnPaySuccessed(parameter.TradeID, result.ToXml());
                    return(null);
                }

                //1)业务结果明确失败
                if (result.GetValue("err_code").ToString() != "USERPAYING" &&
                    result.GetValue("err_code").ToString() != "SYSTEMERROR")
                {
                    //触发回调函数
                    PayFactory.OnPayFailed(parameter.TradeID, result.GetValue("err_code_des").ToSafeString(), xml);
                    return(null);
                }

                //到这里,不能确定支付结果,循环30秒确定
                int checkTimes = parameter.Timeout / 2;
                Thread.Sleep(1000);
                for (int i = 0; i < checkTimes; i++)
                {
                    if (checkPayStateByConfig(parameter, config))
                    {
                        break;
                    }
                    if (i + 1 == checkTimes)
                    {
                        break;
                    }
                    Thread.Sleep(2000);
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            return(null);
        }
Exemplo n.º 43
0
        /**
	    * 
	    * 通过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", Config.APPID);
                data.SetValue("secret", Config.APPSECRET);
                data.SetValue("code", code);
                data.SetValue("grant_type", "authorization_code");
                string url = "https://api.weixin.qq.com/sns/oauth2/access_token?" + data.ToUrl();

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

                Log.Debug(this.GetType().ToString(), "GetOpenidAndAccessTokenFromCode response : " + result);

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

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

                Log.Debug(this.GetType().ToString(), "Get openid : " + openid);
                Log.Debug(this.GetType().ToString(), "Get access_token : " + access_token);
            }
            catch (Exception ex)
            {
                Log.Error(this.GetType().ToString(), ex.ToString());
                throw new WxPayException(ex.ToString());
            }
        }
Exemplo n.º 44
0
        /**
         * 调用统一下单,获得下单结果
         * @return 统一下单结果
         * @失败时抛异常WxPayException
         */
        public WxPayData GetUnifiedOrderResult()
        {
            //统一下单
            WxPayData data = new WxPayData();
            data.SetValue("body", "test");
            data.SetValue("attach", "test");
            data.SetValue("out_trade_no", WxPayApi.GenerateOutTradeNo());
            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);
            if (!result.IsSet("appid") || !result.IsSet("prepay_id") || result.GetValue("prepay_id").ToString() == "")
            {
                Log.Error(this.GetType().ToString(), "UnifiedOrder response error!");
                throw new WxPayException("UnifiedOrder response error!");
            }

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

            WxPayData jsApiParam = new WxPayData();
            jsApiParam.SetValue("appId", unifiedOrderResult.GetValue("appid"));
            jsApiParam.SetValue("timeStamp", WxPayApi.GenerateTimeStamp());
            jsApiParam.SetValue("nonceStr", WxPayApi.GenerateNonceStr());
            jsApiParam.SetValue("package", "prepay_id=" + unifiedOrderResult.GetValue("prepay_id"));
            jsApiParam.SetValue("signType", "MD5");
            jsApiParam.SetValue("paySign", jsApiParam.MakeSign());

            string parameters = jsApiParam.ToJson();

            Log.Debug(this.GetType().ToString(), "Get jsApiParam : " + parameters);
            return parameters;
        }
Exemplo n.º 46
0
        /**
	    * 
	    * 获取收货地址js函数入口参数,详情请参考收货地址共享接口:http://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_9
	    * @return string 共享收货地址js函数需要的参数,json格式可以直接做参数使用
	    */
        public string GetEditAddressParameters()
	    {
            string parameter = "";
            try
            {
                string host = page.Request.Url.Host;
                string path = page.Request.Path;
                string queryString = page.Request.Url.Query;
                //这个地方要注意,参与签名的是网页授权获取用户信息时微信后台回传的完整url
                string url = "http://" + host + path + queryString;

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

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

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

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

            return parameter;
	    }
Exemplo n.º 47
0
        /**
	    * 
	    * 查询订单情况
	    * @param string out_trade_no  商户订单号
	    * @param int succCode         查询订单结果:0表示订单不成功,1表示订单成功,2表示继续查询
	    * @return 订单查询接口返回的数据,参见协议接口
	    */
        public static WxPayData Query(string out_trade_no, out int succCode)
	    {
		    WxPayData queryOrderInput = new WxPayData();
		    queryOrderInput.SetValue("out_trade_no",out_trade_no);
		    WxPayData result = WxPayApi.OrderQuery(queryOrderInput);
		
		    if(result.GetValue("return_code").ToString() == "SUCCESS" 
			    && result.GetValue("result_code").ToString() == "SUCCESS")
		    {
			    //支付成功
			    if(result.GetValue("trade_state").ToString() == "SUCCESS")
                {
				    succCode = 1;
			   	    return result;
			    }
			    //用户支付中,需要继续查询
			    else if(result.GetValue("trade_state").ToString() == "USERPAYING")
                {
				    succCode = 2;
				    return result;
			    }
		    }
		
		    //如果返回错误码为“此交易订单号不存在”则直接认定失败
		    if(result.GetValue("err_code").ToString() == "ORDERNOTEXIST")
		    {
			    succCode = 0;
		    } 
            else
            {
			    //如果是系统错误,则后续继续
			    succCode = 2;
		    }
		    return result;
	    }
Exemplo n.º 48
0
	    /**
	    * 
	    * 撤销订单,如果失败会重复调用10次
	    * @param string out_trade_no 商户订单号
	    * @param depth 调用次数,这里用递归深度表示
        * @return false表示撤销失败,true表示撤销成功
	    */
	    public static bool Cancel(string out_trade_no, int depth = 0)
	    {
		    if(depth > 10)
            {
			    return false;
		    }
		
		    WxPayData reverseInput = new WxPayData();
		    reverseInput.SetValue("out_trade_no",out_trade_no);
		    WxPayData result = WxPayApi.Reverse(reverseInput);
		
		    //接口调用失败
		    if(result.GetValue("return_code").ToString() != "SUCCESS")
            {
			    return false;
		    }
		
		    //如果结果为success且不需要重新调用撤销,则表示撤销成功
		    if(result.GetValue("result_code").ToString() != "SUCCESS" && result.GetValue("recall").ToString() == "N")
            {
			    return true;
		    } 
            else if(result.GetValue("recall").ToString() == "Y") 
            {
			    return Cancel(out_trade_no, ++depth);
		    }
		    return false;
	    }
Exemplo n.º 49
0
        /**
        * 刷卡支付完整业务流程逻辑
        * @param body 商品描述
        * @param total_fee 总金额
        * @param auth_code 支付授权码
        * @throws WxPayException
        * @return 刷卡支付结果
        */
        public static string Run(string body, string total_fee, string auth_code)
        {
            Log.Info("MicroPay", "Micropay is processing...");

            WxPayData data = new WxPayData();
            data.SetValue("auth_code", auth_code);//授权码
            data.SetValue("body", body);//商品描述
            data.SetValue("total_fee", int.Parse(total_fee));//总金额
            data.SetValue("out_trade_no", WxPayApi.GenerateOutTradeNo());//产生随机的商户订单号

            WxPayData result = WxPayApi.Micropay(data, 10); //提交被扫支付,接收返回结果

		    //如果提交被扫支付接口调用失败,则抛异常
            if (!result.IsSet("return_code") || result.GetValue("return_code").ToString() == "FAIL")
		    {
                string returnMsg = result.IsSet("return_msg") ? result.GetValue("return_msg").ToString() : "";
                Log.Error("MicroPay", "Micropay API interface call failure, result : " + result.ToXml());
                throw new WxPayException("Micropay API interface call failure, return_msg : " + returnMsg);
		    }

		    //签名验证
            result.CheckSign();
            Log.Debug("MicroPay", "Micropay response check sign success");

            //刷卡支付直接成功
            if(result.GetValue("return_code").ToString() == "SUCCESS" &&
		        result.GetValue("result_code").ToString() == "SUCCESS")
            {
                Log.Debug("MicroPay", "Micropay business success, result : " + result.ToXml());
                return result.ToPrintStr();
            }

            /******************************************************************
             * 剩下的都是接口调用成功,业务失败的情况
             * ****************************************************************/
		    //1)业务结果明确失败
		    if(result.GetValue("err_code").ToString() != "USERPAYING" && 
		    result.GetValue("err_code").ToString() != "SYSTEMERROR")
		    {
                Log.Error("MicroPay", "micropay API interface call success, business failure, result : " + result.ToXml());
                return result.ToPrintStr();
		    }

            //2)不能确定是否失败,需查单
            //用商户订单号去查单
            string out_trade_no = data.GetValue("out_trade_no").ToString();

		    //确认支付是否成功,每隔一段时间查询一次订单,共查询10次
		    int queryTimes = 10;//查询次数计数器
		    while(queryTimes-- > 0)
		    {
			    int succResult = 0;//查询结果
			    WxPayData queryResult = Query(out_trade_no, out succResult);
			    //如果需要继续查询,则等待2s后继续
			    if(succResult == 2)
                {
				    Thread.Sleep(2000);
				    continue;
			    }
                //查询成功,返回订单查询接口返回的数据
                else if(succResult == 1)
                {
                    Log.Debug("MicroPay", "Mircopay success, return order query result : " + queryResult.ToXml());
                    return queryResult.ToPrintStr();
			    }
                //订单交易失败,直接返回刷卡支付接口返回的结果,失败原因会在err_code中描述
                else
                {
                    Log.Error("MicroPay", "Micropay failure, return micropay result : " + result.ToXml());
                    return result.ToPrintStr();
			    }
		    }

            //确认失败,则撤销订单
            Log.Error("MicroPay", "Micropay failure, Reverse order is processing...");
		    if(!Cancel(out_trade_no))
		    {
                Log.Error("MicroPay", "Reverse order failure");
                throw new WxPayException("Reverse order failure!");
		    }

            return result.ToPrintStr();
        }