Esempio n. 1
0
        /// <summary>
        /// 申请退款完整业务流程逻辑
        /// Refund.Run
        /// </summary>
        /// <param name="transaction_id">微信订单号(优先使用)</param>
        /// <param name="out_trade_no">商户订单号</param>
        /// <param name="total_fee">订单总金额</param>
        /// <param name="refund_fee">退款金额</param>
        /// <returns>退款结果(xml格式)</returns>
        public static string Refund(string transaction_id, string out_trade_no, string total_fee, string refund_fee)
        {
            var methodString = TypeString + ".Refund";

            WxPayLog.Info(methodString, "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", WxPayConfig.MCHID);                //操作员,默认为商户号

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

            WxPayLog.Info(methodString, "Refund process complete, result : " + result.ToXml());
            return(result.ToPrintStr());
        }
Esempio n. 2
0
        /// <summary>
        /// 退款查询完整业务流程逻辑
        /// RefundQuery.Run
        /// </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 RefundQuery(string refund_id, string out_refund_no, string transaction_id, string out_trade_no)
        {
            var methodString = TypeString + ".RefundQuery";

            WxPayLog.Info(methodString, "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,接收返回数据

            WxPayLog.Info(methodString, "RefundQuery process complete, result : " + result.ToXml());
            return(result.ToPrintStr());
        }
Esempio n. 3
0
        /// <summary>
        /// 下载对账单完整业务流程逻辑
        /// DownloadBill.Run
        /// </summary>
        /// <param name="bill_date">下载对账单的日期(格式:20140603,一次只能下载一天的对账单)</param>
        /// <param name="bill_type">
        /// 账单类型
        /// ALL,返回当日所有订单信息,默认值
        /// SUCCESS,返回当日成功支付的订单
        /// REFUND,返回当日退款订单
        /// REVOKED,已撤销的订单
        /// </param>
        /// <returns>对账单结果(xml格式)</returns>
        public static string DownloadBill(string bill_date, string bill_type)
        {
            var methodString = TypeString + ".DownloadBill";

            WxPayLog.Info(methodString, "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,接收返回结果

            WxPayLog.Info(methodString, "DownloadBill process complete, result : \n" + result.ToXml());
            return(result.ToPrintStr());
        }
Esempio n. 4
0
        /**
         *
         * 测速上报接口实现
         * @param WxPayData inputObj 提交给测速上报接口的参数
         * @param int timeOut 测速上报接口超时时间
         * @throws WxPayException
         * @return 成功时返回测速上报接口返回的结果,其他抛异常
         */
        public static WxPayData Report(WxPayData inputObj, int timeOut = 1)
        {
            string url = "https://api.mch.weixin.qq.com/payitil/report";

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

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

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

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

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

            WxPayData result = new WxPayData();

            result.FromXml(response);
            return(result);
        }
Esempio n. 5
0
        public static WxPayData GetNotifyData(HttpContextBase httpContext)
        {
            var methodString = TypeString + ".GetNotifyData";

            //接收从微信后台POST过来的数据
            Stream inputStream = httpContext.Request.InputStream;
            int    count       = 0;

            byte[]        buffer  = new byte[1024];
            StringBuilder builder = new StringBuilder();

            while ((count = inputStream.Read(buffer, 0, 1024)) > 0)
            {
                builder.Append(Encoding.UTF8.GetString(buffer, 0, count));
            }
            inputStream.Flush();
            inputStream.Close();
            inputStream.Dispose();

            var builderString = builder.ToString();

            WxPayLog.Info(methodString, "Receive data from WeChat : " + builderString);

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

            try
            {
                data.FromXml(builderString);
            }
            catch (WxPayException ex)
            {
                //若签名错误,则立即返回结果给微信支付后台
                WxPayData res = new WxPayData();
                res.SetValue("return_code", "FAIL");
                res.SetValue("return_msg", ex.Message);
                var resXml = res.ToXml();
                WxPayLog.Error(methodString, "Sign check error : " + resXml);
                httpContext.Response.Write(resXml);
                httpContext.Response.End();
            }

            WxPayLog.Info(methodString, "Check sign success");
            return(data);
        }
Esempio n. 6
0
        /// <summary>
        /// 生成扫描支付模式一URL
        /// NativePay.GetPrePayUrl
        /// </summary>
        /// <param name="productId">商品ID</param>
        /// <returns>模式一URL</returns>
        public static string GetNativePrePayUrl(string productId)
        {
            var methodString = TypeString + ".GetNativePrePayUrl";

            WxPayLog.Info(methodString, "Native pay mode 1 url is producing...");

            WxPayData data = new WxPayData();

            data.SetValue("appid", WxPayConfig.APPID);                                                             //公众帐号id
            data.SetValue("mch_id", WxPayConfig.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 = string.Join("&", data.GetValues().Select(s => string.Format("{0}={1}", s.Key, s.Value))); //转换为URL串
            string url = "weixin://wxpay/bizpayurl?" + str;

            WxPayLog.Info(methodString, "Get native pay mode 1 url : " + url);
            return(url);
        }
Esempio n. 7
0
        /// <summary>
        /// 订单查询完整业务流程逻辑
        /// OrderQuery.Run
        /// </summary>
        /// <param name="transaction_id">微信订单号(优先使用)</param>
        /// <param name="out_trade_no">商户订单号</param>
        /// <returns>订单查询结果(xml格式)</returns>
        public static string OrderQuery(string transaction_id, string out_trade_no)
        {
            WxPayLog.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,接收返回数据

            WxPayLog.Info("OrderQuery", "OrderQuery process complete, result : " + result.ToXml());
            return(result.ToPrintStr());
        }
Esempio n. 8
0
        public static void ProcessResultNotify(HttpContextBase httpContext)
        {
            var       methodString = TypeString + ".ProcessResultNotify";
            WxPayData notifyData   = GetNotifyData(httpContext);

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

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

            //查询订单,判断订单真实性
            if (!QueryResultOrder(transaction_id))
            {
                //若订单查询失败,则立即返回结果给微信支付后台
                WxPayData res = new WxPayData();
                res.SetValue("return_code", "FAIL");
                res.SetValue("return_msg", "订单查询失败");
                WxPayLog.Error(methodString, "Order query failure : " + res.ToXml());
                httpContext.Response.Write(res.ToXml());
                httpContext.Response.End();
            }
            //查询订单成功
            else
            {
                WxPayData res = new WxPayData();
                res.SetValue("return_code", "SUCCESS");
                res.SetValue("return_msg", "OK");
                WxPayLog.Info(methodString, "order query success : " + res.ToXml());
                httpContext.Response.Write(res.ToXml());
                httpContext.Response.End();
            }
        }
Esempio n. 9
0
        /// <summary>
        /// 生成直接支付url,支付url有效期为2小时,模式二
        /// NativePay.GetPayUrl
        /// </summary>
        /// <param name="productId">商品ID</param>
        /// <returns>模式二URL</returns>
        public static string GetNativePayUrl(string productId)
        {
            var methodString = TypeString + ".GetNativePrePayUrl";

            WxPayLog.Info(methodString, "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();                            //获得统一下单接口返回的二维码链接

            WxPayLog.Info(methodString, "Get native pay mode 2 url : " + url);
            return(url);
        }
Esempio n. 10
0
        public static void ProcessNativeNotify(HttpContextBase httpContext)
        {
            var       methodString = TypeString + ".ProcessNativeNotify";
            WxPayData notifyData   = GetNotifyData(httpContext);

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

            //调统一下单接口,获得下单结果
            string    openid             = notifyData.GetValue("openid").ToString();
            string    product_id         = notifyData.GetValue("product_id").ToString();
            WxPayData unifiedOrderResult = new WxPayData();

            try
            {
                //统一下单
                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", product_id);
                unifiedOrderResult = WxPayApi.UnifiedOrder(req);
            }
            catch (Exception ex)//若在调统一下单接口时抛异常,立即返回结果给微信支付后台
            {
                WxPayData res = new WxPayData();
                res.SetValue("return_code", "FAIL");
                res.SetValue("return_msg", "统一下单失败");
                WxPayLog.Error(methodString, "UnifiedOrder failure : " + res.ToXml());
                httpContext.Response.Write(res.ToXml());
                httpContext.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", "统一下单失败");
                WxPayLog.Error(methodString, "UnifiedOrder failure : " + res.ToXml());
                httpContext.Response.Write(res.ToXml());
                httpContext.Response.End();
            }

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

            data.SetValue("return_code", "SUCCESS");
            data.SetValue("return_msg", "OK");
            data.SetValue("appid", WxPayConfig.APPID);
            data.SetValue("mch_id", WxPayConfig.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());

            WxPayLog.Info(methodString, "UnifiedOrder success , send data to WeChat : " + data.ToXml());
            httpContext.Response.Write(data.ToXml());
            httpContext.Response.End();
        }
Esempio n. 11
0
        /// <summary>
        /// 刷卡支付完整业务流程逻辑
        /// MicroPay.Run
        /// </summary>
        /// <param name="body">商品描述</param>
        /// <param name="total_fee">总金额</param>
        /// <param name="auth_code">支付授权码</param>
        /// <returns>刷卡支付结果</returns>
        /// <exception cref="WxPayException"></exception>
        public static string MicroPay(string body, string total_fee, string auth_code)
        {
            var methodString = TypeString + ".MicroPay";

            WxPayLog.Info(methodString, "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() : "";
                WxPayLog.Error(methodString, "Micropay API interface call failure, result : " + result.ToXml());
                throw new WxPayException("Micropay API interface call failure, return_msg : " + returnMsg);
            }

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

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

            /******************************************************************
            * 剩下的都是接口调用成功,业务失败的情况
            * ****************************************************************/
            //1)业务结果明确失败
            if (result.GetValue("err_code").ToString() != "USERPAYING" &&
                result.GetValue("err_code").ToString() != "SYSTEMERROR")
            {
                WxPayLog.Error(methodString, "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 = MicroPayQuery(out_trade_no, out succResult);
                //如果需要继续查询,则等待2s后继续
                if (succResult == 2)
                {
                    Thread.Sleep(2000);
                    continue;
                }
                //查询成功,返回订单查询接口返回的数据
                else if (succResult == 1)
                {
                    WxPayLog.Debug(methodString, "Mircopay success, return order query result : " + queryResult.ToXml());
                    return(queryResult.ToPrintStr());
                }
                //订单交易失败,直接返回刷卡支付接口返回的结果,失败原因会在err_code中描述
                else
                {
                    WxPayLog.Error(methodString, "Micropay failure, return micropay result : " + result.ToXml());
                    return(result.ToPrintStr());
                }
            }

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

            return(result.ToPrintStr());
        }