/// <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", "未查询到该订单号的付款信息"); } }
public string TestTransfer(int amount) { WxPayData wpd = Transfer.Run(amount, "你好雅心!", "okn8I0bp6xDylvYC9jlVwV9yGnFQ", ObjectId.GenerateNewId().ToString()); return(wpd.ToPrintStr()); }
/** * 刷卡支付完整业务流程逻辑 * @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()); }
/// <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()); }
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()); }