public ActionResult Refund() { var doc = XDocument.Load(Request.InputStream); var sPara = doc.Root.Descendants().ToDictionary(x => x.Name.LocalName, x => x.Value); if (sPara.Count <= 0) { throw new ArgumentNullException(); } LogWriter.Default.WriteError("Refund Parameters:" + sPara.ToString());//记录请求关键信息到日志中去 bool isVerify = false; var sign = sPara["sign"]; var retcode = sPara["retcode"]; if (retcode != "0") { isVerify = false; } else { var signValue = WxPayAPI.Sign(sPara, WeixinConfig.PartnerKey); isVerify = sign == signValue; } if (!isVerify) { return(Content(string.Format("<xml><return_code><![CDATA[{0}]]></return_code></xml>", "FAIL"))); } //TODO:商户处理订单逻辑 //END 商户处理订单逻辑 string out_trade_no = sPara["out_trade_no"];//商户订单ID: 1.注意交易单不要重复处理;2.注意判断返回金额 return(Content(string.Format("<xml><return_code><![CDATA[{0}]]></return_code><return_msg><![CDATA[{1}]]></return_msg></xml>", "SUCCESS", "OK"))); }
public ActionResult Notify() { var form = Request.QueryString; var sPara = GetRequestPost(form); if (sPara.Count <= 0) { throw new ArgumentNullException(); } Log.Instence.LogWriteLine(form.ToString());//记录请求关键信息到日志中去 if (sPara["return_code"] == "SUCCESS" && sPara["return_code"] == "SUCCESS") { var sign_type = sPara["sign_type"]; var sign = sPara["sign"]; var signValue = WxPayAPI.Sign(sPara, WeixinConfig.PartnerKey); bool isVerify = sign == signValue; if (isVerify) { var out_trade_no = sPara["out_trade_no"]; //TODO 商户处理订单逻辑: 1.注意交易单不要重复处理;2.注意判断返回金额 //TODO:postData中携带该次支付的用户相关信息,这将便于商家拿到openid,以便后续提供更好的售后服务,譬如:微信公众好通知用户付款成功。如果不提供服务则可以删除此代码 var openid = sPara["openid"]; return(Content("SUCCESS")); } return(Content("FAIL")); } else { return(Content("FAIL")); } }
/// <summary> /// 公共API => 支付结果通用通知 /// http://pay.weixin.qq.com/wiki/doc/api/index.php?chapter=9_7 /// 微信支付回调,不需要证书 /// /// 应用场景 /// 支付完成后,微信会把相关支付结果和用户信息发送给商户,商户需要接收处理,并返回应答。 /// 对后台通知交互时,如果微信收到商户的应答不是成功或超时,微信认为通知失败,微信会通过一定的策略(如30分钟共8次)定期重新发起通知,尽可能提高通知的成功率,但微信不保证通知最终能成功。 /// 由于存在重新发送后台通知的情况,因此同样的通知可能会多次发送给商户系统。商户系统必须能够正确处理重复的通知。 /// 推荐的做法是,当收到通知进行处理时,首先检查对应业务数据的状态,判断该通知是否已经处理过,如果没有处理过再进行处理,如果处理过直接返回结果成功。在对业务数据进行状态检查和处理之前,要采用数据锁进行并发控制,以避免函数重入造成的数据混乱。 /// 技术人员可登进微信商户后台扫描加入接口报警群。 /// </summary> /// <returns></returns> // [HttpPost] public string Notify() { WeiXinConfig wxconfig = BMAConfig.WeiXinConfig; var form = Request.QueryString; var sPara = GetRequestPost(form); if (sPara.Count <= 0) { //throw new ArgumentNullException(); //Content("进来了"); return("进来了"); } BMALog.Instance.Write("111:" + form.ToString()); if (sPara["return_code"] == "SUCCESS" && sPara["return_code"] == "SUCCESS") { var sign_type = sPara["sign_type"]; var sign = sPara["sign"]; var signValue = WxPayAPI.Sign(sPara, wxconfig.PartnerKey); bool isVerify = sign == signValue; if (isVerify) { var out_trade_no = sPara["out_trade_no"]; //TODO 商户处理订单逻辑: 1.注意交易单不要重复处理;2.注意判断返回金额 var cash_fee = BrnMall.Core.Common.Utils.StrToInt(sPara["cash_fee"]); //取得type int strtype = 1; string[] arrtype = out_trade_no.Split('_'); try { strtype = BrnMall.Core.Common.Utils.StrToInt(arrtype[1]); } catch { BMALog.Instance.Write("获取Type出错,订单号:" + out_trade_no + " 订单金额:" + cash_fee); } //TODO:postData中携带该次支付的用户相关信息,这将便于商家拿到openid,以便后续提供更好的售后服务,譬如:微信公众好通知用户付款成功。如果不提供服务则可以删除此代码 var openid = sPara["openid"]; try { BrnMall.Core.BLL.SpHelp.SP_CheckPayOrder(out_trade_no, openid, cash_fee, strtype, 1); } catch (Exception ex) { BMALog.Instance.Write(ex.ToString()); } //return Content("success"); return("success"); } //return Content("fail"); return("fail"); } else { // return Content("fail"); return("fail"); } }
public void Product(string openid, string total_fee) { ViewBag.PayOpenId = openid; if (string.IsNullOrEmpty(openid) || string.IsNullOrEmpty(total_fee)) { Response.Write("<span style='color:#FF0000;font-size:20px'>" + "页面传参出错,请返回重试" + "</span>"); } //JSAPI支付预处理 try { var stringADict = new Dictionary <string, string>(); stringADict.Add("appid", WeixinConfig.AppID); stringADict.Add("mch_id", WeixinConfig.mch_id); stringADict.Add("device_info", WeixinConfig.DeviceInfo); stringADict.Add("nonce_str", CommonHelper.CreateNonceStr()); stringADict.Add("body", "统一下单test"); stringADict.Add("attach", "test"); stringADict.Add("out_trade_no", CommonHelper.CreateOutTradeNo()); stringADict.Add("fee_type", "CNY"); stringADict.Add("total_fee", total_fee); stringADict.Add("spbill_create_ip", "8.8.8.8"); stringADict.Add("time_start", DateTime.Now.ToString("yyyyMMddHHmmss")); stringADict.Add("time_expire", DateTime.Now.AddMinutes(10).ToString("yyyyMMddHHmmss")); stringADict.Add("goods_tag", "jjj"); stringADict.Add("notify_url", ""); stringADict.Add("trade_type", "JSAPI"); stringADict.Add("product_id", ""); //stringADict.Add("limit_pay", limit_pay); stringADict.Add("openid", openid); var _sign = WxPayAPI.Sign(stringADict, WeixinConfig.PartnerKey);//生成签名字符串 var _postdata = CommonHelper.GeneralPostdata(stringADict, _sign); ViewBag.WxJsApiParam = _postdata; dynamic _result = WxPayAPI.UnifiedOrder(WeixinConfig.AppID, WeixinConfig.mch_id, WeixinConfig.DeviceInfo, CommonHelper.CreateNonceStr(), "统一下单test", "", "test", CommonHelper.CreateOutTradeNo(), "CNY", Convert.ToInt32(total_fee), "8.8.8.8", DateTime.Now.ToString("yyyyMMddHHmmss"), DateTime.Now.AddMinutes(10).ToString("yyyyMMddHHmmss"), "jjj", "", "JSAPI", "", "no_credit", openid, WeixinConfig.PartnerKey); //在页面上显示订单信息 Response.Write("<span style='color:#00CD00;font-size:20px'>订单详情:</span><br/>"); if (_result.return_code.ToString().IndexOf("SUCCESS") >= 0) { Response.Write("<textarea rows='3' cols='2' style='color:#00CD00;font-size:20px;width:98%;' >" + _result.ToString() + "</textarea>"); } else { Response.Write("<textarea rows='3' cols='2' style='color:#00CD00;font-size:20px;width:98%;' >" + _result.return_msg + "</textarea>"); } } catch (Exception ex) { Response.Write("<span style='color:#FF0000;font-size:20px'>" + "下单失败,请返回重试" + "</span>"); } }
public JsonResult Index() { var form = Request.Form; var sPara = GetRequestPost(form); WeiXinConfig wxconfig = BMAConfig.WeiXinConfig; if (sPara.Count <= 0) { throw new ArgumentNullException(); } //LogWriter.Default.WriteInfo(form.ToString());//记录请求关键信息到日志中去 Logs.Write(form.ToString()); var out_trade_no = BrnMall.Core.Common.Utils.GenerateOutTradeNo(); //Guid.NewGuid().ToString(); var domain = wxconfig.Domain; var body = sPara["body"]; var detail = sPara["detail"]; var attach = sPara["attach"]; var fee_type = "CNY"; var total_fee = int.Parse(sPara["total_fee"]) * 100; var trade_type = sPara["trade_type"]; var spbill_create_ip = (trade_type == "APP" || trade_type == "NATIVE") ? Request.UserHostName : wxconfig.Spbill_create_ip; var time_start = DateTime.Now.ToString("yyyyMMddHHmmss"); var time_expire = DateTime.Now.AddHours(1).ToString("yyyyMMddHHmmss"); //默认1个小时订单过期,开发者可自定义其他超时机制,原则上微信订单超时时间不超过2小时 var goods_tag = sPara["goods_tag"]; var notify_url = string.Format("{0}/mobile/WXPay/Notify", domain); //与下面的Notify对应,开发者可自定义其他url地址 var product_id = sPara["product_id"]; var openid = sPara["openid"]; var partnerKey = wxconfig.PartnerKey; var content = WxPayAPI.UnifiedOrder( wxconfig.AppID, wxconfig.Mch_id, wxconfig.Device_info, Util.CreateNonce_str(), body, detail, attach, out_trade_no, fee_type, total_fee, spbill_create_ip, time_start, time_expire, goods_tag, notify_url, trade_type, product_id, openid, partnerKey); if (content.return_code.Value == "SUCCESS" && content.result_code.Value == "SUCCESS") { var result = new { prepay_id = content.prepay_id.Value, trade_type = content.trade_type.Value, sign = content.sign.Value, nonce_str = content.nonce_str.Value, return_code = content.result_code.Value, return_msg = "", }; return(Json(result)); } else { var result = new { return_code = content.return_code.Value, return_msg = content.return_msg.Value, }; return(Json(result)); } }
public JsonResult Index() { var form = Request.Form; var sPara = GetRequestPost(form); if (sPara.Count <= 0) { throw new ArgumentNullException(); } Common.LogHelper.LogError(form.ToString());//记录请求关键信息到日志中去 var out_trade_no = Guid.NewGuid().ToString(); var domain = System.Configuration.ConfigurationManager.AppSettings["Domain"]; var body = sPara["body"]; var detail = sPara["detail"]; var attach = sPara["attach"]; var fee_type = "CNY"; var total_fee = int.Parse(sPara["total_fee"]); var trade_type = sPara["trade_type"]; var spbill_create_ip = (trade_type == "APP" || trade_type == "NATIVE") ? Request.UserHostName : WeixinConfig.spbill_create_ip; var time_start = DateTime.Now.ToString("yyyyMMddHHmmss"); var time_expire = DateTime.Now.AddHours(1).ToString("yyyyMMddHHmmss"); //默认1个小时订单过期,开发者可自定义其他超时机制,原则上微信订单超时时间不超过2小时 var goods_tag = sPara["goods_tag"]; var notify_url = string.Format("{0}/WXPay/Notify", domain); //与下面的Notify对应,开发者可自定义其他url地址 var product_id = sPara["product_id"]; var openid = sPara["openid"]; var partnerKey = WeixinConfig.PartnerKey; var content = WxPayAPI.UnifiedOrder( WeixinConfig.AppID, WeixinConfig.mch_id, WeixinConfig.device_info, Util.CreateNonce_str(), body, detail, attach, out_trade_no, fee_type, total_fee, spbill_create_ip, time_start, time_expire, goods_tag, notify_url, trade_type, product_id, openid, partnerKey); if (content.return_code.Value == "SUCCESS" && content.result_code.Value == "SUCCESS") { var result = new { prepay_id = content.prepay_id.Value, trade_type = content.trade_type.Value, sign = content.sign.Value, nonce_str = content.nonce_str.Value, return_code = content.result_code.Value, return_msg = "", }; return(Json(result)); } else { var result = new { return_code = content.return_code.Value, return_msg = content.return_msg.Value, }; return(Json(result)); } }
public void OrderQuery(string transactionId, string outTradeNo) { dynamic _result = WxPayAPI.OrderQuery(WeixinConfig.AppID, WeixinConfig.mch_id, transactionId, outTradeNo, CommonHelper.CreateNonceStr(), WeixinConfig.PartnerKey); if (_result.return_code.ToString().IndexOf("SUCCESS") >= 0) { Response.Write("<textarea rows='3' cols='2' style='color:#00CD00;font-size:20px;width:98%;' >" + _result.ToString() + "</textarea>"); } else { Response.Write("<textarea rows='3' cols='2' style='color:#00CD00;font-size:20px;width:98%;' >" + _result.return_msg + "</textarea>"); } }
public void RefundOrder(string transactionId, string outTradeNo, string totalFee, string refundFee) { dynamic _result = WxPayAPI.RefundOrder(WeixinConfig.AppID, WeixinConfig.mch_id, WeixinConfig.DeviceInfo, CommonHelper.CreateNonceStr(), transactionId, outTradeNo, CommonHelper.CreateOutTradeNo(), Convert.ToInt32(totalFee), Convert.ToInt32(refundFee), "CNY", WeixinConfig.mch_id, "REFUND_SOURCE_RECHARGE_FUNDS", WeixinConfig.PartnerKey); if (_result.return_code.ToString().IndexOf("SUCCESS") >= 0) { Response.Write("<textarea rows='3' cols='2' style='color:#00CD00;font-size:20px;width:98%;' >" + _result.ToString() + "</textarea>"); } else { Response.Write("<textarea rows='3' cols='2' style='color:#00CD00;font-size:20px;width:98%;' >" + _result.return_msg + "</textarea>"); } }
public void DownloadBill(string billDate, string billType) { dynamic _result = WxPayAPI.Downloadbill(WeixinConfig.AppID, WeixinConfig.mch_id, WeixinConfig.DeviceInfo, CommonHelper.CreateNonceStr(), billDate, billType, "GZIP", WeixinConfig.PartnerKey); if (_result.return_code.ToString().IndexOf("SUCCESS") >= 0) { //订单写入数据库 Response.Write("<textarea rows='3' cols='2' style='color:#00CD00;font-size:20px;width:98%;' >" + _result.ToString() + "</textarea>"); } else { Response.Write("<textarea rows='3' cols='2' style='color:#00CD00;font-size:20px;width:98%;' >" + _result.return_msg + "</textarea>"); } }
public ActionResult NativePay(string productId) { string _model1 = WxBizPayAPI.Mode1(WeixinConfig.AppID, WeixinConfig.mch_id, CommonHelper.CreateTimestamp().ToString(), CommonHelper.CreateNonceStr(), productId, WeixinConfig.PartnerKey); //统一下单二维码生成 dynamic _result = WxPayAPI.UnifiedOrder( WeixinConfig.AppID, WeixinConfig.mch_id, WeixinConfig.DeviceInfo, CommonHelper.CreateNonceStr(), "贡献一分钱", "", "", CommonHelper.CreateOutTradeNo(), "CNY", 1, "8.8.8.8", DateTime.Now.ToString("yyyyMMddHHmmss"), DateTime.Now.AddMinutes(10).ToString("yyyyMMddHHmmss"), "jjj", "", "NATIVE", productId, "no_credit", "", WeixinConfig.PartnerKey); dynamic _model2 = WxBizPayAPI.Mode2(_result.code_url); ViewBag.Model1 = _model1; try { ViewBag.Model2 = _model2; } catch { } return(View()); }
/// <summary> /// 公共API => 支付结果通用通知 /// http://pay.weixin.qq.com/wiki/doc/api/index.php?chapter=9_7 /// 微信支付回调,不需要证书 /// /// 应用场景 /// 支付完成后,微信会把相关支付结果和用户信息发送给商户,商户需要接收处理,并返回应答。 /// 对后台通知交互时,如果微信收到商户的应答不是成功或超时,微信认为通知失败,微信会通过一定的策略(如30分钟共8次)定期重新发起通知,尽可能提高通知的成功率,但微信不保证通知最终能成功。 /// 由于存在重新发送后台通知的情况,因此同样的通知可能会多次发送给商户系统。商户系统必须能够正确处理重复的通知。 /// 推荐的做法是,当收到通知进行处理时,首先检查对应业务数据的状态,判断该通知是否已经处理过,如果没有处理过再进行处理,如果处理过直接返回结果成功。在对业务数据进行状态检查和处理之前,要采用数据锁进行并发控制,以避免函数重入造成的数据混乱。 /// 技术人员可登进微信商户后台扫描加入接口报警群。 /// </summary> /// <returns></returns> // [HttpPost] //public string Notify() //{ // WeiXinConfig wxconfig = BMAConfig.WeiXinConfig; // //var form = Request.QueryString; // //var sPara = GetRequestPost(form); // var requestContent = ""; // using (StreamReader sr = new StreamReader(Request.InputStream)) // { // requestContent = sr.ReadToEnd(); // } // BMALog.Instance.Write(requestContent);//记录请求关键信息到日志中去 // //bool isVerify = false; // var sPara = GetRequestPostByXml(requestContent); // BMALog.Instance.Write("有进来过"); // if (sPara.Count <= 0) // { // //throw new ArgumentNullException(); // //Content("进来了"); // return "进来了"; // } // BMALog.Instance.Write("111:" + requestContent); // if (sPara["return_code"] == "SUCCESS" && sPara["return_code"] == "SUCCESS") // { // var sign_type = sPara["sign_type"]; // var sign = sPara["sign"]; // var signValue = WxPayAPI.Sign(sPara, wxconfig.PartnerKey); // bool isVerify = sign == signValue; // BMALog.Instance.Write("isVerify:" + isVerify + " 返回签名:" + sign + " 本地签名:" + signValue); // //if (isVerify) // //{ // var out_trade_no = sPara["out_trade_no"]; // //TODO 商户处理订单逻辑: 1.注意交易单不要重复处理;2.注意判断返回金额 // var cash_fee = BrnMall.Core.Common.Utils.StrToInt(sPara["cash_fee"]); // //取得type // int strtype = 1; // string[] arrtype = out_trade_no.Split('_'); // try // { // strtype = BrnMall.Core.Common.Utils.StrToInt(arrtype[1]); // } // catch // { // BMALog.Instance.Write("获取Type出错,订单号:" + out_trade_no + " 订单金额:" + cash_fee); // } // //TODO:postData中携带该次支付的用户相关信息,这将便于商家拿到openid,以便后续提供更好的售后服务,譬如:微信公众好通知用户付款成功。如果不提供服务则可以删除此代码 // var openid = sPara["openid"]; // try // { // BrnMall.Core.BLL.SpHelp.SP_CheckPayOrder(out_trade_no, openid, cash_fee, strtype, 1); // } // catch (Exception ex) // { // BMALog.Instance.Write(ex.ToString()); // } // //return Content("success"); // return "success"; // // } // //return Content("fail"); // return "fail"; // } // else // { // // return Content("fail"); // return "fail"; // } //} /// <summary> /// 微信退款完成后的回调 /// </summary> /// <returns></returns> public ActionResult Refund() { WeiXinConfig wxconfig = BMAConfig.WeiXinConfig; var requestContent = ""; using (StreamReader sr = new StreamReader(Request.InputStream)) { requestContent = sr.ReadToEnd(); } Logs.Write(requestContent); // LogWriter.Default.WriteInfo(requestContent);//记录请求关键信息到日志中去 bool isVerify = false; var sPara = GetRequestPostByXml(requestContent); if (sPara.Count <= 0) { throw new ArgumentNullException(); } var sign = sPara["sign"]; var retcode = sPara["retcode"]; if (retcode != "0") { isVerify = false; } else { var signValue = WxPayAPI.Sign(sPara, wxconfig.PartnerKey); isVerify = sign == signValue; } if (!isVerify) { return(Content("fail")); } //TODO:商户处理订单逻辑 return(Content("success")); }
public ActionResult Notify() { var doc = XDocument.Load(Request.InputStream); var sPara = doc.Root.Descendants().ToDictionary(x => x.Name.LocalName, x => x.Value); if (sPara.Count <= 0) { throw new ArgumentNullException(); } LogWriter.Default.WriteError("Notify Parameters:" + sPara.ToString());//记录请求关键信息到日志中去 if (sPara["return_code"] == "SUCCESS" && sPara["result_code"] == "SUCCESS") { var sign = sPara["sign"]; var signValue = WxPayAPI.Sign(sPara, WeixinConfig.PartnerKey); bool isVerify = sign == signValue; LogWriter.Default.WriteError("Verify:" + isVerify + "|sign/signValue:" + sign + "," + signValue); if (isVerify) { string out_trade_no = sPara["out_trade_no"]; //商户订单ID: 1.注意交易单不要重复处理;2.注意判断返回金额 string transaction_id = sPara["transaction_id"]; //微信支付订单号 string time_end = sPara["time_end"]; //支付完成时间 int total_fee = int.Parse(sPara["total_fee"]); //总金额 string bank_type = sPara["bank_type"]; //付款银行 //**************************************************************************************** //TODO 商户处理订单逻辑: 1.注意交易单不要重复处理;2.注意判断返回金额 //TODO:postData中携带该次支付的用户相关信息,这将便于商家拿到openid,以便后续提供更好的售后服务,譬如:微信公众好通知用户付款成功。如果不提供服务则可以删除此代码 var openid = sPara["openid"]; LogWriter.Default.WriteError("Notify Success, out_trade_no:" + out_trade_no + ",transaction_id" + transaction_id + ",time_end:" + time_end + ",total_fee:" + total_fee + ",bank_type:" + bank_type + ",openid:" + openid); return(Content(string.Format("<xml><return_code><![CDATA[{0}]]></return_code><return_msg><![CDATA[{1}]]></return_msg></xml>", "SUCCESS", "OK"))); } } return(Content(string.Format("<xml><return_code><![CDATA[{0}]]></return_code></xml>", "FAIL"))); }
public ActionResult JsApiPay(string openid, string total_fee) { ViewBag.PayOpenId = openid; ViewBag.TotleFee = total_fee; if (string.IsNullOrEmpty(openid) || string.IsNullOrEmpty(total_fee)) { Response.Write("<span style='color:#FF0000;font-size:20px'>" + "页面传参出错,请返回重试" + "</span>"); } dynamic _result = WxPayAPI.UnifiedOrder(WeixinConfig.AppID, WeixinConfig.mch_id, WeixinConfig.DeviceInfo, CommonHelper.CreateNonceStr(), "统一下单test", "", "test", CommonHelper.CreateOutTradeNo(), "CNY", Convert.ToInt32(total_fee), "8.8.8.8", DateTime.Now.ToString("yyyyMMddHHmmss"), DateTime.Now.AddMinutes(10).ToString("yyyyMMddHHmmss"), "jjj", "", "JSAPI", "", "no_credit", openid, WeixinConfig.PartnerKey); if (_result.return_code.ToString().IndexOf("SUCCESS") >= 0) { var stringADict = new Dictionary <string, string>(); stringADict.Add("appid", WeixinConfig.AppID); stringADict.Add("timeStamp", CommonHelper.CreateTimestamp().ToString()); stringADict.Add("nonceStr", CommonHelper.CreateNonceStr()); stringADict.Add("package", "prepay_id=" + _result.prepay_id); stringADict.Add("signType", "MD5"); stringADict.Add("openid", openid); var _sign = WxPayAPI.Sign(stringADict, WeixinConfig.PartnerKey);//生成签名字符串 stringADict.Add("paySign", _sign); ViewBag.WxJsApiParam = stringADict; Response.Write("<textarea rows='3' cols='2' style='color:#00CD00;font-size:20px;width:98%;' >" + stringADict + "</textarea>"); } else { Response.Write("<textarea rows='3' cols='2' style='color:#00CD00;font-size:20px;width:98%;' >" + _result.return_msg + "</textarea>"); } return(View()); }
public ActionResult OrderPay() { //订单id列表 string oidList = WebHelper.GetQueryString("oidList"); string paySystemName = ""; decimal allSurplusMoney = 0M; List <OrderInfo> orderList = new List <OrderInfo>(); foreach (string oid in StringHelper.SplitString(oidList)) { //订单信息 OrderInfo orderInfo = Orders.GetOrderByOid(TypeHelper.StringToInt(oid)); if (orderInfo != null && orderInfo.Uid == WorkContext.Uid && orderInfo.OrderState == (int)OrderState.WaitPaying && orderInfo.PayMode == 1 && (paySystemName.Length == 0 || paySystemName == orderInfo.PaySystemName)) { orderList.Add(orderInfo); } else { return(Redirect(Url.Action("index", "home"))); } paySystemName = orderInfo.PaySystemName; allSurplusMoney += orderInfo.SurplusMoney; } if (orderList.Count < 1 || allSurplusMoney == 0M) { return(Redirect(Url.Action("index", "home"))); } WeiXinConfig wxconfig = BMAConfig.WeiXinConfig; var appId = wxconfig.AppID; //WeixinConfig.AppID; var nonceStr = Util.CreateNonce_str(); var timestamp = DateTime.Now.Ticks.ToString().Substring(0, 10); var domain = wxconfig.Domain; var url = Request.Url.ToString().Replace("#", "");// domain + Request.Url.PathAndQuery; var jsTickect = WeiXinHelp.IsExistjsapi_ticket(); var string1 = ""; var signature = WeiXinHelp.GetjsSDK_Signature(nonceStr, jsTickect, timestamp, url); //JSAPI.GetSignature(jsTickect, nonceStr, timestamp, url, out string1); var userAgent = Request.UserAgent; var userVersion = userAgent.Substring(userAgent.LastIndexOf("/") + 1); //WeiXinConfig wxconfig = BMAConfig.WeiXinConfig; //Logs.Write(form.ToString()); var out_trade_no = orderList[0].OSN; //Guid.NewGuid().ToString(); //var domain = wxconfig.Domain; var body = "购买创梦星火商城商品"; var detail = "购买创梦星火商城商品"; var attach = "购买创梦星火商城商品"; var fee_type = "CNY"; var total_fee = Decimal.ToInt32(orderList[0].SurplusMoney) * 100;// *100; var trade_type = "JSAPI"; var spbill_create_ip = (trade_type == "APP" || trade_type == "NATIVE") ? Request.UserHostName : wxconfig.Spbill_create_ip; var time_start = DateTime.Now.ToString("yyyyMMddHHmmss"); var time_expire = DateTime.Now.AddDays(7).ToString("yyyyMMddHHmmss"); //默认1个小时订单过期,开发者可自定义其他超时机制,原则上微信订单超时时间不超过2小时 var goods_tag = "商品"; var notify_url = wxconfig.NOTIFY_URL; //与下面的Notify对应,开发者可自定义其他url地址 var product_id = orderList[0].Oid.ToString(); var openid = WorkContext.Openid; var partnerKey = wxconfig.PartnerKey; var content = WxPayAPI.UnifiedOrder( wxconfig.AppID, wxconfig.Mch_id, wxconfig.Device_info, Util.CreateNonce_str(), body, detail, attach, out_trade_no, fee_type, total_fee, spbill_create_ip, time_start, time_expire, goods_tag, notify_url, trade_type, product_id, openid, partnerKey); var prepay_id = ""; //var trade_type = ""; var paySign = ""; //var timestamp = ""; var nonce_str = ""; var return_code = ""; if (content.return_code.Value == "SUCCESS" && content.result_code.Value == "SUCCESS") { WxPayAPIHelp.WxPayData jsApiParam = new WxPayAPIHelp.WxPayData(); string payTimeSamp = DateTime.Now.Ticks.ToString().Substring(0, 10); jsApiParam.SetValue("appId", wxconfig.AppID); jsApiParam.SetValue("timeStamp", payTimeSamp); jsApiParam.SetValue("nonceStr", content.nonce_str.Value); jsApiParam.SetValue("package", "prepay_id=" + content.prepay_id.Value); jsApiParam.SetValue("signType", "MD5"); //prepay_id = content.prepay_id.Value; prepay_id = content.prepay_id.Value; trade_type = content.trade_type.Value; paySign = jsApiParam.MakeSign(); timestamp = payTimeSamp; nonce_str = content.nonce_str.Value; return_code = content.result_code.Value; } else { return(PromptView("错误编号:" + content.return_code.Value + "错误信息:" + content.return_msg.Value)); } OrderPayModel model = new OrderPayModel(); model.OidList = oidList; model.AllSurplusMoney = allSurplusMoney; model.OrderList = orderList; model.PayPlugin = Plugins.GetPayPluginBySystemName(paySystemName); model.nonceStr = nonceStr; model.jsapiTicket = jsTickect; model.nonce_str = nonce_str; model.paySign = paySign; model.signature = signature; model.timestamp = timestamp; model.userAgent = userAgent; model.userVersion = userVersion; model.appId = appId; model.prepay_id = prepay_id; return(View(model)); //return PromptView("出错了!"); }
public JsonResult WxPay() //public HttpResponseMessage WxPay() { if (WebHelper.IsGet()) { var result = new { return_code = "erro", return_msg = "请求错误", }; return(Json(result)); //return new HttpResponseMessage { Content = new StringContent(result.ToString(), System.Text.Encoding.UTF8, "application/json") }; } else { var form = Request.Form; var sPara = GetRequestPost(form); WeiXinConfig wxconfig = BMAConfig.WeiXinConfig; if (sPara.Count <= 0) { throw new ArgumentNullException(); } //LogWriter.Default.WriteInfo(form.ToString());//记录请求关键信息到日志中去 BMALog.Instance.Write(form.ToString()); var out_trade_no = BrnMall.Core.Common.Utils.GenerateOutTradeNo() + "_" + sPara["paytype"]; //Guid.NewGuid().ToString(); var domain = wxconfig.Domain; var body = sPara["body"]; var detail = sPara["detail"]; var attach = sPara["attach"]; var fee_type = "CNY"; var total_fee = int.Parse(sPara["total_fee"]) * 100; var trade_type = sPara["trade_type"]; var spbill_create_ip = (trade_type == "APP" || trade_type == "NATIVE") ? Request.UserHostName : wxconfig.Spbill_create_ip; var time_start = DateTime.Now.ToString("yyyyMMddHHmmss"); var time_expire = DateTime.Now.AddHours(1).ToString("yyyyMMddHHmmss"); //默认1个小时订单过期,开发者可自定义其他超时机制,原则上微信订单超时时间不超过2小时 var goods_tag = sPara["goods_tag"]; var notify_url = wxconfig.NOTIFY_URL; //string.Format("{0}/mob/WXPay/Notify", domain);//与下面的Notify对应,开发者可自定义其他url地址 var product_id = sPara["product_id"]; var openid = sPara["openid"]; var partnerKey = wxconfig.PartnerKey; var content = WxPayAPI.UnifiedOrder( wxconfig.AppID, wxconfig.Mch_id, wxconfig.Device_info, Util.CreateNonce_str(), body, detail, attach, out_trade_no, fee_type, total_fee, spbill_create_ip, time_start, time_expire, goods_tag, notify_url, trade_type, product_id, openid, partnerKey); BMALog.Instance.Write("url:" + notify_url + "|||con:" + content); if (content.return_code.Value == "SUCCESS" && content.result_code.Value == "SUCCESS") { WxPayAPIHelp.WxPayData jsApiParam = new WxPayAPIHelp.WxPayData(); string payTimeSamp = DateTime.Now.Ticks.ToString().Substring(0, 10); jsApiParam.SetValue("appId", wxconfig.AppID); jsApiParam.SetValue("timeStamp", payTimeSamp); jsApiParam.SetValue("nonceStr", content.nonce_str.Value); jsApiParam.SetValue("package", "prepay_id=" + content.prepay_id.Value); jsApiParam.SetValue("signType", "MD5"); var result = new { prepay_id = content.prepay_id.Value, trade_type = content.trade_type.Value, sign = content.sign.Value, sign1 = jsApiParam.MakeSign(), timestamp = payTimeSamp, nonce_str = content.nonce_str.Value, return_code = content.result_code.Value, return_msg = "", }; //string result = "{\"return_code\":\"SUCCESS\",\"sc\":\"123\"}"; return(Json(result)); //return new HttpResponseMessage { Content = new StringContent(result.ToString(), System.Text.Encoding.UTF8, "application/json") }; } else { var result = new { return_code = content.return_code.Value, return_msg = content.return_msg.Value, }; return(Json(result)); //return new HttpResponseMessage { Content = new StringContent(result.ToString(), System.Text.Encoding.UTF8, "application/json") }; } } }
public ActionResult Index() { try { var out_trade_no = Guid.NewGuid().ToString("N"); var domain = System.Configuration.ConfigurationManager.AppSettings["Domain"]; var body = "商品描述"; var detail = "商品详情"; var attach = ""; var product_id = "1"; var openid = User.Identity.Name; var goods_tag = ""; var fee_type = "CNY"; var total_fee = 10; var trade_type = "JSAPI"; var appId = System.Configuration.ConfigurationManager.AppSettings["AppId"]; var nonceStr = Util.CreateNonce_str(); var timestamp = Util.CreateTimestamp(); var success_redict_url = string.Format("{0}/WxPay/Success", domain); var url = domain + Request.Url.PathAndQuery; var userAgent = Request.UserAgent; var userVersion = userAgent.Substring(userAgent.LastIndexOf("MicroMessenger/") + 15, 3);//微信版本号高于或者等于5.0才支持微信支付 var spbill_create_ip = (trade_type == "APP" || trade_type == "NATIVE") ? Request.UserHostName : WeixinConfig.spbill_create_ip; var time_start = DateTime.Now.ToString("yyyyMMddHHmmss"); var time_expire = DateTime.Now.AddHours(1).ToString("yyyyMMddHHmmss"); //默认1个小时订单过期,开发者可自定义其他超时机制,原则上微信订单超时时间不超过2小时 var notify_url = string.Format("{0}/WxPay/Notify", domain); //与下面的Notify对应,开发者可自定义其他url地址 var partnerKey = WeixinConfig.PartnerKey; var mch_id = WeixinConfig.mch_id; var device_info = WeixinConfig.device_info; var returnXML = ""; var paramaterXml = ""; var content = WxPayAPI.UnifiedOrder( appId, mch_id, device_info, nonceStr, body, detail, attach, out_trade_no, fee_type, total_fee, spbill_create_ip, time_start, time_expire, goods_tag, notify_url, trade_type, product_id, openid, partnerKey, out returnXML, out paramaterXml); LogWriter.Default.WriteError(paramaterXml); LogWriter.Default.WriteError(returnXML); var prepay_id = ""; var sign = ""; var return_code = ""; var return_msg = ""; var err_code = ""; var err_code_des = ""; var isUnifiedOrderSuccess = false; if (content.return_code.Value == "SUCCESS" && content.result_code.Value == "SUCCESS") { prepay_id = content.prepay_id.Value; sign = WxPayAPI.SignPay(appId, timestamp.ToString(), nonceStr, prepay_id, partnerKey); trade_type = content.trade_type.Value; isUnifiedOrderSuccess = true; } else { return_code = content.return_code.Value; return_msg = content.return_msg.Value; isUnifiedOrderSuccess = false; } if (!isUnifiedOrderSuccess) { return(RedirectToAction("Failed", new { msg = "(代码:101)服务器下单失败,请重试" })); } var model = new JSPayModel { appId = appId, nonceStr = nonceStr, timestamp = timestamp, userAgent = userAgent, userVersion = userVersion, attach = "", body = body, detail = detail, openid = openid, product_id = out_trade_no, goods_tag = goods_tag, price = total_fee, total_fee = total_fee, prepay_id = prepay_id, trade_type = trade_type, sign = sign, return_code = return_code, return_msg = return_msg, err_code = err_code, err_code_des = err_code_des, success_redict_url = success_redict_url }; return(View(model)); } catch (Exception ex) { LogWriter.Default.WriteError(ex.Message); return(RedirectToAction("Failed", new { msg = "(代码:200)" + ex.Message })); } }
protected void Page_Load(object sender, EventArgs e) { StringBuilder sb = new StringBuilder(); StreamReader reader = new StreamReader(Request.InputStream); String xmlData = reader.ReadToEnd(); var sPara = GetRequestPostByXml(xmlData); if (sPara.Count <= 0) { throw new ArgumentNullException(); } if (sPara["return_code"] == "SUCCESS" && sPara["result_code"] == "SUCCESS") { var sign = sPara["sign"]; Dictionary <string, string> sPara2 = new Dictionary <string, string>(); foreach (var item in sPara) { if (item.Key != "sign") { sPara2.Add(item.Key, item.Value); } } var signValue = WxPayAPI.Sign(sPara2, WxConfig.PartnerKey); bool isVerify = sign == signValue; if (isVerify) { var out_trade_no = sPara["out_trade_no"]; var transaction_id = sPara["transaction_id"]; var total_fee = sPara["total_fee"]; decimal pay_money = decimal.Parse(total_fee) / 100; Logger.Info(string.Format("用户订单,微信公众号支付通知,订单号{0},支付单号{1},支付金额{2}", out_trade_no, transaction_id, pay_money)); UserInfoManager uim = new UserInfoManager(); UserFinancialManager ufm = new UserFinancialManager(); DataTable userfinancial = ufm.GetUserFinancialInfoByPayId(out_trade_no); if (userfinancial != null && userfinancial.Rows.Count == 1) { Hashtable hashufdb = DataTableHelper.DataRowToHashTable(userfinancial.Rows[0]); Hashtable hashuf = new Hashtable(); hashuf["ID"] = SiteHelper.GetHashTableValueByKey(hashufdb, "ID"); hashuf["OrderNum"] = SiteHelper.GetHashTableValueByKey(hashufdb, "OrderNum"); hashuf["UserID"] = SiteHelper.GetHashTableValueByKey(hashufdb, "UserID"); hashuf["State"] = UserFinancialState.Effect.GetHashCode(); hashuf["TradeNo"] = transaction_id; hashuf["TotalFee"] = pay_money; hashuf["PayWay"] = UserFinancialOperatorWay.WeixinPubPay; decimal changesAmount = 0.00m; decimal.TryParse(SiteHelper.GetHashTableValueByKey(hashufdb, "ChangesAmount"), out changesAmount); bool isSuccess = false; if (Math.Abs(changesAmount) == pay_money) { isSuccess = uim.OrderPayCallback(hashuf); } if (isSuccess) { sb.Append("<xml>"); sb.Append("<return_code>SUCCESS</return_code>"); sb.Append("<return_msg></return_msg>"); sb.Append("</xml>"); } else { sb.Append("<xml>"); sb.Append("<return_code>FAIL</return_code>"); sb.Append("<return_msg>error</return_msg>"); sb.Append("</xml>"); } } } } else { sb.Append("<xml>"); sb.Append("<return_code>FAIL</return_code>"); sb.Append("<return_msg>error</return_msg>"); sb.Append("</xml>"); } Response.Write(sb); }
public ActionResult Notify() { var doc = XDocument.Load(Request.InputStream); var sPara = doc.Root.Descendants().ToDictionary(x => x.Name.LocalName, x => x.Value); if (sPara.Count <= 0) { throw new ArgumentNullException(); } LogWriter.Default.WriteError("Notify Parameters:" + sPara.ToString());//记录请求关键信息到日志中去 if (sPara["return_code"] == "SUCCESS" && sPara["result_code"] == "SUCCESS") { var sign = sPara["sign"]; var signValue = WxPayAPI.Sign(sPara, WeixinConfig.PartnerKey); bool isVerify = sign == signValue; LogWriter.Default.WriteError("Verify:" + isVerify + "|sign/signValue:" + sign + "," + signValue); if (isVerify) { string out_trade_no = sPara["out_trade_no"]; //商户订单ID: 1.注意交易单不要重复处理;2.注意判断返回金额 string transaction_id = sPara["transaction_id"]; //微信支付订单号 string time_end = sPara["time_end"]; //支付完成时间 int total_fee = int.Parse(sPara["total_fee"]); //总金额 string bank_type = sPara["bank_type"]; //付款银行 var openid = sPara["openid"]; //**************************************************************************************** //TODO 商户处理订单逻辑: 1.注意交易单不要重复处理;2.注意判断返回金额 T_Order order = null; using (IT_Order repository = new T_OrderRepository()) { order = repository.FindFirstOrDefault(o => o.OrderNo == out_trade_no); } if (order != null) { order.PayStatus = 1; T_Shop shop = null; using (IT_Shop repository = new T_ShopRepository()) { shop = repository.FindFirstOrDefault(o => o.ID == order.ShopID); } if (shop != null) { string cardNo = string.Empty; var code = new Random().Next(1000, 9999).ToString(); if (shop.LockType != 1) { WK.Tea.Lock.ApiRequest.CreateCardRequest postEntity = new WK.Tea.Lock.ApiRequest.CreateCardRequest { communityNo = "1316882760", roomNo = shop.RoomNo, floorNo = shop.FloorNo, buildNo = shop.BuildNo, startTime = order.BTime.AddMinutes(-15).ToString("yyMMddHHmm"), endTime = order.ETime.AddMinutes(10).ToString("yyMMddHHmm"), mobile = string.IsNullOrWhiteSpace(order.Mobile) ? WK.Tea.Lock.ApiRequest.LockApiHelper.Mobile : order.Mobile }; WK.Tea.Lock.ApiRequest.CreateCardResponse result = WK.Tea.Lock.ApiRequest.LockApiHelper.WebApi.Post <WK.Tea.Lock.ApiRequest.CreateCardRequest, WK.Tea.Lock.ApiRequest.CreateCardResponse>("https://api.uclbrt.com/?c=Qrcode&a=getLink", postEntity); cardNo = result.cardNo; } else { var startTime = order.BTime.AddMinutes(-15).ToString("yyMMddHHmm"); var endTime = order.ETime.AddMinutes(10).ToString("yyMMddHHmm"); WebApiHelper.CreateInstance().AddLockKey(code, shop.LockID, startTime, endTime); } order.CardNo = cardNo; order.LockPW = code; using (IT_Order repository = new T_OrderRepository()) { repository.Update(order); } //TODO:postData中携带该次支付的用户相关信息,这将便于商家拿到openid,以便后续提供更好的售后服务,譬如:微信公众好通知用户付款成功。如果不提供服务则可以删除此代码 string url = "http://dc.orangenet.com.cn/Door/Qrcode?orderId=" + order.ID; WeixinTempMsg.SendOrderPaySuccessMsg(openid, url, shop.ShopAddress, order.BTime, order.ETime, order.FeeCode.Value, order.OrderNo); WeixinTempMsg.SendManagerOrderMsg(url, shop.ShopAddress, order.BTime, order.ETime, order.FeeCode.Value, order.OrderNo); WeixinTempMsg.SendSMS(shop.ShopAddress, order.Mobile, shop.ShopPhoneNum, order.BTime, order.ETime, url); //WeixinTempMsg.SendCleanMsg(shop.ShopAddress, order.OrderNo, order.BTime, order.ETime); } else { LogWriter.Default.WriteError("Shop Error, out_trade_no:" + out_trade_no + ", shop is null"); } } else { LogWriter.Default.WriteError("Order Error, out_trade_no:" + out_trade_no + ", order is null"); } LogWriter.Default.WriteError("Notify Success, out_trade_no:" + out_trade_no + ",transaction_id" + transaction_id + ",time_end:" + time_end + ",total_fee:" + total_fee + ",bank_type:" + bank_type + ",openid:" + openid); return(Content(string.Format("<xml><return_code><![CDATA[{0}]]></return_code><return_msg><![CDATA[{1}]]></return_msg></xml>", "SUCCESS", "OK"))); } } return(Content(string.Format("<xml><return_code><![CDATA[{0}]]></return_code></xml>", "FAIL"))); }
public int RefreshTradeState(DateTime startOrderDate, DateTime endOrderDate) { List <ProductOrder> poList; WeChatPayData queryOrderPayData; int handledRows = 0; try { //获取数据库中指定时间范围的订单 poList = ProductOrder.FindAllOrders(startOrderDate, endOrderDate); for (int i = 0; i < poList.Count; i++) { try { //针对数据库中每个订单查询微信支付状态 queryOrderPayData = WxPayAPI.OrderQueryByOutTradeNo(poList[i].OrderID); if (queryOrderPayData != null) { Log.Info(this.GetType().ToString(), "向微信查询订单实际支付状态:" + queryOrderPayData.ToXml()); //校验微信支付返回的OpenID与原订单OpenID是否相符 if (queryOrderPayData.IsSet("openid")) { if (poList[i].Purchaser.OpenID != queryOrderPayData.GetValue("openid").ToString()) { throw new Exception(string.Format("微信支付返回的OpenID:{0}与原订单OpenID:{1}不符", queryOrderPayData.GetValue("openid").ToString(), poList[i].Purchaser.OpenID)); } } else { throw new Exception("微信支付没有返回OpenID"); } //校验微信支付返回的总金额与原订单金额是否相符 if (queryOrderPayData.IsSet("total_fee")) { decimal totalFee; if (decimal.TryParse(queryOrderPayData.GetValue("total_fee").ToString(), out totalFee)) { totalFee = totalFee / 100; if (poList[i].OrderPrice != totalFee) { throw new Exception(string.Format("微信支付返回的订单总金额{0}元与原订单金额{1}元不符", totalFee, poList[i].OrderPrice)); } } else { throw new Exception("微信支付返回的订单总金额格式转换错误total_fee"); } } else { throw new Exception("微信支付没有返回订单总金额total_fee"); } //获取返回的微信支付状态 if (queryOrderPayData.IsSet("trade_state")) { //根据查询返回的trade_state设置数据库中用户订单的微信支付实际状态 switch (queryOrderPayData.GetValue("trade_state").ToString().ToUpper()) { case "SUCCESS": //支付成功 poList[i].TradeState = TradeState.SUCCESS; break; case "REFUND": //转入退款 poList[i].TradeState = TradeState.REFUND; break; case "NOTPAY": //未支付状态,就没有交易时间time_end poList[i].TradeState = TradeState.NOTPAY; break; case "CLOSED": //已关闭 poList[i].TradeState = TradeState.CLOSED; break; case "REVOKED": //已撤销(刷卡支付) poList[i].TradeState = TradeState.REVOKED; break; case "USERPAYING": //用户支付中 poList[i].TradeState = TradeState.USERPAYING; break; case "PAYERROR": //支付失败(其他原因,如银行返回失败) poList[i].TradeState = TradeState.PAYERROR; break; default: //未知状态,默认为未支付 poList[i].TradeState = TradeState.NOTPAY; break; } } else { throw new Exception("微信支付没有返回支付状态trade_state"); } //获取微信支付交易流水号、交易时间、交易描述 poList[i].TransactionID = queryOrderPayData.IsSet("transaction_id") ? queryOrderPayData.GetValue("transaction_id").ToString() : string.Empty; poList[i].TransactionTime = queryOrderPayData.IsSet("time_end") ? (DateTime?)DateTime.ParseExact(queryOrderPayData.GetValue("time_end").ToString(), "yyyyMMddHHmmss", System.Globalization.CultureInfo.InvariantCulture) : null; poList[i].TradeStateDesc = queryOrderPayData.IsSet("trade_state_desc") ? queryOrderPayData.GetValue("trade_state_desc").ToString() : string.Empty; //更新订单支付状态 ProductOrder.UpdateTradeState(poList[i]); } } catch (Exception ex) { //对每个订单的异常只记录,不退出循环 Log.Error(this.GetType().ToString(), "RefreshTradeState : " + ex.Message); } handledRows++; } } catch (Exception ex) { Log.Error(this.GetType().ToString(), "RefreshTradeState : " + ex.Message); } return(handledRows); }