コード例 #1
0
        /// <summary>
        /// 查询订单情况
        /// </summary>
        /// <param name="out_trade_no">商户订单号</param>
        /// <param name="succCode">查询订单结果:0表示订单不成功,1表示订单成功,2表示继续查询</param>
        /// <returns>订单查询接口返回的数据,参见协议接口</returns>
        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 = WxPayAPI2.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);
        }
コード例 #2
0
        /// <summary>
        /// 撤销订单,如果失败会重复调用10次
        /// </summary>
        /// <param name="out_trade_no">商户订单号</param>
        /// <param name="depth">调用次数,这里用递归深度表示</param>
        /// <returns>false表示撤销失败,true表示撤销成功</returns>
        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 = WxPayAPI2.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);
        }
コード例 #3
0
        /// <summary>
        /// 下载对账单完整业务流程逻辑
        /// </summary>
        /// <param name="bill_date">下载对账单的日期(格式:20140603,一次只能下载一天的对账单)</param>
        /// <param name="bill_type">账单类型
        /// ALL,返回当日所有订单信息,默认值
        /// SUCCESS,返回当日成功支付的订单
        /// REFUND,返回当日退款订单
        /// REVOKED,已撤销的订单
        /// </param>
        /// <returns>对账单结果(xml格式)</returns>
        public static string Run(string bill_date, string bill_type)
        {
            WxPayData data = new WxPayData();

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

            return(result.ToPrintStr());
        }
コード例 #4
0
        //查询订单
        private bool QueryOrder(string transaction_id)
        {
            WxPayData req = new WxPayData();

            req.SetValue("transaction_id", transaction_id);
            WxPayData res = WxPayAPI2.OrderQuery(req);

            if (res.GetValue("return_code").ToString() == "SUCCESS" &&
                res.GetValue("result_code").ToString() == "SUCCESS")
            {
                return(true);
            }
            else
            {
                return(false);
            }
        }
コード例 #5
0
        /// <summary>
        /// 订单查询完整业务流程逻辑
        /// </summary>
        /// <param name="transaction_id">微信订单号(优先使用)</param>
        /// <param name="out_trade_no">商户订单号</param>
        /// <returns>订单查询结果(xml格式)</returns>
        public static string Run(string transaction_id, string out_trade_no)
        {
            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 = WxPayAPI2.OrderQuery(data);//提交订单查询请求给API,接收返回数据

            return(result.ToPrintStr());
        }
コード例 #6
0
        /// <summary>
        /// 生成直接支付url,支付url有效期为2小时,模式二
        /// </summary>
        /// <param name="productId">商品ID</param>
        /// <returns>模式二URL</returns>
        public static string GetPayUrl(string productId)
        {
            WxPayData data = new WxPayData();

            data.SetValue("body", "test");                                                        //商品描述
            data.SetValue("attach", "test");                                                      //附加数据
            data.SetValue("out_trade_no", CommonHelper.CreateOutTradeNo());                       //随机字符串
            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 = WxPayAPI2.UnifiedOrder(data);                                      //调用统一下单接口
            string    url    = result.GetValue("code_url").ToString();                            //获得统一下单接口返回的二维码链接

            return(url);
        }
コード例 #7
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="openId"></param>
        /// <param name="productId"></param>
        /// <returns></returns>
        private WxPayData UnifiedOrder(string openId, string productId)
        {
            //统一下单
            WxPayData req = new WxPayData();

            req.SetValue("body", "test");
            req.SetValue("attach", "test");
            req.SetValue("out_trade_no", CommonHelper.CreateOutTradeNo());
            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 = WxPayAPI2.UnifiedOrder(req);

            return(result);
        }
コード例 #8
0
        /// <summary>
        /// 申请退款完整业务流程逻辑
        /// </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 Run(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", CommonHelper.CreateOutTradeNo()); //随机生成商户退款单号
            data.SetValue("op_user_id", GlobalContext.MCHId);                //操作员,默认为商户号

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

            return(result.ToPrintStr());
        }
コード例 #9
0
        /// <summary>
        /// 调用统一下单,获得下单结果
        /// </summary>
        /// <returns>统一下单结果</returns>
        public WxPayData GetUnifiedOrderResult()
        {
            //统一下单
            WxPayData data = new WxPayData();

            data.SetValue("body", "test");
            data.SetValue("attach", "test");
            data.SetValue("out_trade_no", CommonHelper.CreateOutTradeNo());
            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 = WxPayAPI2.UnifiedOrder(data);

            if (!result.IsSet("appid") || !result.IsSet("prepay_id") || result.GetValue("prepay_id").ToString() == "")
            {
                throw new WxPayException("UnifiedOrder response error!");
            }
            unifiedOrderResult = result;
            return(result);
        }
コード例 #10
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());
        }
コード例 #11
0
        /// <summary>
        /// 刷卡支付完整业务流程逻辑
        /// </summary>
        /// <param name="body">商品描述</param>
        /// <param name="total_fee">总金额</param>
        /// <param name="auth_code">支付授权码</param>
        /// <returns>刷卡支付结果</returns>
        public static string Run(string body, string total_fee, string auth_code)
        {
            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", CommonHelper.CreateOutTradeNo()); //产生随机的商户订单号

            WxPayData result = WxPayAPI2.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() : "";
                throw new WxPayException("Micropay API interface call failure, return_msg : " + returnMsg);
            }
            //签名验证
            result.CheckSign();
            //刷卡支付直接成功
            if (result.GetValue("return_code").ToString() == "SUCCESS" &&
                result.GetValue("result_code").ToString() == "SUCCESS")
            {
                return(result.ToPrintStr());
            }

            /******************************************************************
            * 剩下的都是接口调用成功,业务失败的情况
            * ****************************************************************/
            //1)业务结果明确失败
            if (result.GetValue("err_code").ToString() != "USERPAYING" &&
                result.GetValue("err_code").ToString() != "SYSTEMERROR")
            {
                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)
                {
                    return(queryResult.ToPrintStr());
                }
                //订单交易失败,直接返回刷卡支付接口返回的结果,失败原因会在err_code中描述
                else
                {
                    return(result.ToPrintStr());
                }
            }

            if (!Cancel(out_trade_no))
            {
                throw new WxPayException("Reverse order failure!");
            }

            return(result.ToPrintStr());
        }