コード例 #1
0
ファイル: WxPay.ashx.cs プロジェクト: hmwenwen/wen
        /// <summary>
        /// 改签退款
        /// </summary>
        /// <param name="dicPar"></param>
        public void Refund(Dictionary <string, object> dicPar)
        {
            List <string> pra = new List <string>()
            {
                "GUID", "refund_fee", "orderno"
            };

            //检测方法需要的参数
            if (!CheckActionParameters(dicPar, pra))
            {
                return;
            }

            var refund_fee = dicPar["refund_fee"].ToString(); //退款金额  如果空,则为退所有
            var orderno    = dicPar["orderno"].ToString();

            WxPayData data      = new WxPayData();
            var       sql       = "SELECT money,transaction_id,out_trade_no FROM dbo.Wx_Pay WHERE out_trade_no=(SELECT out_trade_no FROM dbo.WX_orderdetails WHERE orderno='" + orderno + "')";
            var       orderInfo = SQL.SQLTool.ExecuteDataTable(sql);

            if (orderInfo.Rows.Count > 0)                                     //如果数据库返回了数据才进行退款
            {
                var total_fee = Convert.ToString(orderInfo.Rows[0]["money"]); //
                if (refund_fee == "0")
                {
                    refund_fee = total_fee;
                }
                var transaction_id = Convert.ToString(orderInfo.Rows[0]["transaction_id"]);
                var out_trade_no   = Convert.ToString(orderInfo.Rows[0]["out_trade_no"]);

                if (!string.IsNullOrEmpty(transaction_id))//微信订单号存在的条件下,则已微信订单号为准
                {
                    data.SetValue("transaction_id", transaction_id);
                }
                else//微信订单号不存在,才根据商户订单号去退款
                {
                    data.SetValue("out_trade_no", out_trade_no);
                }
                // SetParam.SetParams(stocode);
                var out_refund_no = WxPayApi.GenerateOutTradeNo();  //退款单号
                data.SetValue("total_fee", int.Parse(total_fee));   //订单总金额
                data.SetValue("refund_fee", int.Parse(refund_fee)); //退款金额
                data.SetValue("out_refund_no", out_refund_no);      //随机生成商户退款单号
                data.SetValue("op_user_id", WxPayConfig.MCHID);     //操作员,默认为商户号
                WxPayData result  = WxPayApi.Refund(data);          //提交退款申请给API,接收返回数据
                var       pResult = result.ToPrintStr();

                var v           = pResult.Split('|');
                var strWhere    = string.Empty;
                var result_code = string.Empty;
                for (int i = 0; i < v.Count(); i++)
                {
                    if (v[i].Contains("refund_id"))
                    {
                        strWhere += "refund_id='" + Convert.ToString(v[i].Split('=')[1]) + "',";
                    }
                    else if (v[i].Contains("result_code"))
                    {
                        result_code = Convert.ToString(v[i].Split('=')[1]);
                        strWhere   += "result_code='" + result_code + "',";
                    }
                    else if (v[i].Contains("err_code_des"))
                    {
                        strWhere += "err_code_des='" + Convert.ToString(v[i].Split('=')[1]) + "',";
                    }
                }

                try
                {
                    sql = "update WX_orderdetails SET " + strWhere + " out_refund_no='" + out_refund_no + "',status='7' WHERE orderno='" + Tools.SafeSql(orderno) + "'";
                    SQLTool.ExecuteScalar(sql);
                    ToCustomerJson("0", result_code);
                }
                catch (Exception ex)
                {
                    ToCustomerJson("1", "退款失败");
                }
            }
            else
            {
                ToCustomerJson("2", "未查询到该订单号的付款信息");
            }
        }
コード例 #2
0
        public string TestTransfer(int amount)
        {
            WxPayData wpd = Transfer.Run(amount, "你好雅心!", "okn8I0bp6xDylvYC9jlVwV9yGnFQ", ObjectId.GenerateNewId().ToString());

            return(wpd.ToPrintStr());
        }
コード例 #3
0
        /**
         * 刷卡支付完整业务流程逻辑
         * @param body 商品描述
         * @param total_fee 总金额
         * @param auth_code 支付授权码
         * @throws WxPayException
         * @return 刷卡支付结果
         */
        public static string Run(string body, string total_fee, string auth_code, string device_info = "")
        {
            //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()); //产生随机的商户订单号
            data.SetValue("device_info", device_info);
            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());
        }
コード例 #4
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());
        }
コード例 #5
0
        public static string SendRequest(PayInfo pay, PayConfig config)
        {
            IDictionary <string, string> dictionary = new Dictionary <string, string>();
            WxPayData wxPayData = new WxPayData();

            wxPayData.SetValue("auth_code", pay.Attach);
            wxPayData.SetValue("body", pay.OutTradeNo);
            WxPayData wxPayData2 = wxPayData;
            decimal   totalFee   = pay.TotalFee;

            wxPayData2.SetValue("total_fee", int.Parse(totalFee.ToString()));
            wxPayData.SetValue("out_trade_no", pay.OutTradeNo);
            dictionary.Add("auth_code", pay.AuthCode);
            dictionary.Add("body", pay.OutTradeNo);
            IDictionary <string, string> dictionary2 = dictionary;

            totalFee = pay.TotalFee;
            dictionary2.Add("total_fee", totalFee.ToString());
            dictionary.Add("out_trade_no", pay.OutTradeNo);
            dictionary.Add("AppId", config.AppId);
            dictionary.Add("AppSecret", config.AppSecret);
            dictionary.Add("MchID", config.MchID);
            dictionary.Add("Key", config.Key);
            dictionary.Add("NOTIFY_URL", config.NOTIFY_URL);
            WxPayData wxPayData3 = WxPayApi.Micropay(wxPayData, config, 10);

            if (!wxPayData3.IsSet("return_code") || wxPayData3.GetValue("return_code").ToString() == "FAIL")
            {
                string msg = wxPayData3.IsSet("return_msg") ? wxPayData3.GetValue("return_msg").ToString() : "";
                WxPayLog.writeLog(dictionary, "", HttpContext.Current.Request.Url.ToString(), msg, LogType.MicroPay);
            }
            wxPayData3.CheckSign(config.Key);
            if (wxPayData3.GetValue("return_code").ToString() == "SUCCESS" && wxPayData3.GetValue("result_code").ToString() == "SUCCESS")
            {
                return(wxPayData3.ToPrintStr());
            }
            if (wxPayData3.GetValue("err_code").ToString() != "USERPAYING" && wxPayData3.GetValue("err_code").ToString() != "SYSTEMERROR")
            {
                return(wxPayData3.ToPrintStr());
            }
            string out_trade_no = wxPayData.GetValue("out_trade_no").ToString();
            int    num          = 10;

            while (num-- > 0)
            {
                int       num3       = 0;
                WxPayData wxPayData4 = MicroPay.Query(out_trade_no, config, out num3);
                switch (num3)
                {
                case 2:
                    break;

                case 1:
                    return(wxPayData4.ToPrintStr());

                default:
                    return(wxPayData3.ToPrintStr());
                }
                Thread.Sleep(2000);
            }
            if (!MicroPay.Cancel(out_trade_no, config, 0))
            {
                WxPayLog.writeLog(dictionary, "", HttpContext.Current.Request.Url.ToString(), "支付失败并且撤销订单失败", LogType.MicroPay);
                throw new WxPayException("Reverse order failure!");
            }
            return(wxPayData3.ToPrintStr());
        }