public ActionResult Add(SceneryDomain model) { #region 判断景区名称是否存在 var query = QueryCondition.Instance; query.AddEqual("Scenery", "SceneryName", model.SceneryName); query.AddEqual("Scenery", "RowState", "1"); if (model.Id > 0) { query.AddNotEqual("Scenery", "Id", model.Id.ToString()); } if (Smart.Instance.SceneryBizService.GetAllDomain(query).Count > 0) { LoadData(); ViewBag.Error = string.Format("已经存在名称:{0},请重新填写", model.SceneryName); return(View(model)); } #endregion #region 判断同程景区ID 是否存在 query = QueryCondition.Instance; query.AddEqual("Scenery", "SceneryTCId", model.SceneryTCId.ToString()); query.AddEqual("Scenery", "RowState", "1"); if (model.Id > 0) { query.AddNotEqual("Scenery", "Id", model.Id.ToString()); } if (Smart.Instance.SceneryBizService.GetAllDomain(query).Count > 0) { LoadData(); ViewBag.Error = string.Format("已经存在同程景区ID:{0},请重新填写", model.SceneryTCId); return(View(model)); } #endregion model.Updater = CurrentUser.Name; model.UpdateTime = DateTime.Now; if (model.Id == 0) { model.CreateTime = DateTime.Now; model.Creater = CurrentUser.Name; Smart.Instance.SceneryBizService.Add(model); ViewBag.Error = "1"; return(RedirectToAction("Add", "Scenery", new { Error = 1 })); } ViewBag.Error = "1"; var oldModel = Smart.Instance.SceneryBizService.GetAllDomain(QueryCondition.Instance.AddEqual("Scenery", "Id", model.Id.ToString())); if (Smart.Instance.AlipayDetailBizService.IsExistsSceneryAlipay(model.SceneryName) || Smart.Instance.WeChatDetailBizService.IsExistsSceneryWeChat(model.SceneryName)) { model.SceneryName = oldModel[0].SceneryName; model.SceneryTCId = oldModel[0].SceneryTCId; } if (Smart.Instance.SceneryBizService.Update(model)) { LogHelper.AlipayLog(string.Format("景区\r\n 修改人:{0} \r\n 修改前:{1} \r\n 修改后:{2}", CurrentUser.Name, JsonConvert.SerializeObject(oldModel), JsonConvert.SerializeObject(model))); } return(RedirectToAction("Index", "Scenery")); }
/// <summary> /// 取消订单 /// </summary> /// <param name="out_trade_no"></param> /// <returns></returns> public string CloseOrder(string out_trade_no, SceneryDomain sceneryDomain) { string return_code = ""; try { LogHelper.WeChatLog(string.Format("wx:正在取消订单:{0}", out_trade_no)); WxPayData data = new WxPayData(); data.SetValue("out_trade_no", out_trade_no); //随机字符串 WxPayData result = WxPayApi.CloseOrder(data, sceneryDomain.WeChat); //调用统一下单接口 return_code = result.GetValue("return_code").ToString(); //获得统一下单接口返回的二维码链接 LogHelper.WeChatLog(string.Format("wx:取消-结果:{0}-{1}", return_code, result.GetValue("return_msg"))); //失败 或者 成功时但err_code =SYSTEMERROR 时, 系统异常,请重新调用该API if (result.GetValue("return_code").ToString() == "SUCCESS" && result.GetValue("result_code").ToString() == "SUCCESS") { LogHelper.WeChatLog("wx:开启线程"); ParameterizedThreadStart ParStart = new ParameterizedThreadStart(CloselOrderRetry); Thread myThread = new Thread(ParStart); List <object> objs = new List <object>(); objs.Add(out_trade_no); objs.Add(sceneryDomain); myThread.Start(objs); } } catch (Exception ex) { LogHelper.WeChatLog(string.Format("wx:正在取消订单", ex.Message)); } return(return_code); }
/// <summary> /// 接收从微信支付后台发送过来的数据并验证签名 /// </summary> /// <returns>微信支付后台返回的数据</returns> public WxPayData GetNotifyData(SceneryDomain sceneryDomain) { //接收从微信后台POST过来的数据 System.IO.Stream s = Request.InputStream; int count = 0; byte[] buffer = new byte[1024]; StringBuilder builder = new StringBuilder(); while ((count = s.Read(buffer, 0, 1024)) > 0) { builder.Append(Encoding.UTF8.GetString(buffer, 0, count)); } s.Flush(); s.Close(); s.Dispose(); XmlDocument xmlDoc = new XmlDocument(); xmlDoc.LoadXml(builder.ToString()); XmlNode xmlNode = xmlDoc.FirstChild;//获取到根节点<xml> XmlNodeList nodes = xmlNode.ChildNodes; foreach (XmlNode xn in nodes) { XmlElement xe = (XmlElement)xn; if (xe.Name == "appid") { var appid = xe.InnerText; LogHelper.WeChatLog("appid : " + appid); if (WxPayConfigBizService.wxPayConfigList == null) { new WxPayConfigBizService().ReLoadWxPayList(appid); } sceneryDomain.WeChat = WxPayConfigBizService.wxPayConfigList.First(t => t.APPID == appid); if (sceneryDomain.WeChat == null) { throw new WxPayException("没有找到微信账号!"); } break; } } LogHelper.WeChatLog("Receive data from WeChat : " + builder.ToString()); //转换数据格式并验证签名 WxPayData data = new WxPayData(); data.FromXml(builder.ToString(), sceneryDomain.WeChat.PAYKEY); LogHelper.WeChatLog("Check sign success"); return(data); }
/// <summary> /// 新增/修改 /// </summary> /// <param name="Id"></param> /// <param name="Error"></param> /// <returns></returns> public ActionResult Add(int?Id, string Error) { ViewBag.Error = Error; var model = new SceneryDomain(); if (Id.HasValue) { var query = QueryCondition.Instance.AddEqual("Scenery", "Id", Id.Value.ToString()); model = Smart.Instance.SceneryBizService.GetAllDomain(query).FirstOrDefault(); } AddOrUpdateBaseInfo(model); LoadData(); return(View(model)); }
/** * 生成直接支付url,支付url有效期为2小时,模式二 * @param productId 商品ID * @return 模式二URL */ public UnifiedorderResponse GetPayUrl(UnifiedorderRequest orderRequest, SceneryDomain sceneryDomain) { WeChatQRCodeDomain qrCode = new WeChatQRCodeDomain(); qrCode.BatchNumber = orderRequest.out_trade_no; qrCode.SceneryName = sceneryDomain.SceneryName; qrCode.Creater = orderRequest.attach; qrCode.Updater = orderRequest.attach; qrCode.Phone = orderRequest.Phone; UnifiedorderResponse response = new UnifiedorderResponse(); string out_trade_no = GenerateSerialIdService.Get(FixedPrefix.WeChat, CustomPrefix.A, sceneryDomain.SceneryTCId.ToString()).SerialId; orderRequest.out_trade_no = out_trade_no; WxPayData data = new WxPayData(); data.SetValue("body", orderRequest.body); //商品描述 data.SetValue("out_trade_no", out_trade_no); //随机字符串 data.SetValue("total_fee", Convert.ToInt32(orderRequest.total_fee)); //总金额 //10分钟 时间间隔 data.SetValue("time_start", DateTime.Now.ToString("yyyyMMddHHmmss")); //交易起始时间 data.SetValue("time_expire", DateTime.Now.AddMinutes(10).ToString("yyyyMMddHHmmss")); //交易结束时间 data.SetValue("trade_type", "NATIVE"); //交易类型 data.SetValue("product_id", orderRequest.productId); //商品ID data.SetValue("attach", orderRequest.attach); //机器号 string url = ""; try { qrCode.Out_trade_no = orderRequest.out_trade_no; qrCode.RequestJson = data.ToXml(); WxPayData result = WxPayApi.UnifiedOrder(data, sceneryDomain.WeChat);//调用统一下单接口 if (result.GetValue("return_code").ToString() == "SUCCESS") { url = result.GetValue("code_url").ToString();//获得统一下单接口返回的二维码链接 LogHelper.WeChatLog(string.Format("请求成功,二维码地址:{0}", url)); } else { qrCode.Remark = result.GetValue("return_msg").ToString(); LogHelper.WeChatLog(string.Format("二维码地址请求失败:{0}", result.GetValue("return_msg"))); } response.Out_trade_no = out_trade_no; response.QRCode = url; qrCode.AppId = sceneryDomain.WeChat.APPID; qrCode.QrCode = url; } catch (Exception ex) { qrCode.Remark = ex.Message; LogHelper.WeChatLog(string.Format("获取微信URL:请求失败,保存信息:{0}", ex.Message)); } finally { try { new WeChatQRCodeDao().Add(qrCode); } catch (Exception ex) { LogHelper.WeChatLog(string.Format("获取微信URL:新增操作日志失败:{0}", ex.Message)); } } return(response); }
/// <summary> /// 查询订单支付状态 /// </summary> /// <param name="request"></param> /// <param name="sceneryDomain"></param> /// <returns></returns> public QueryResponse OrderQuery(QueryRequest request, SceneryDomain sceneryDomain) { QueryResponse queryResponse = new QueryResponse(); var result = false; try { WxPayData data = new WxPayData(); data.SetValue("out_trade_no", request.Out_trade_no); //随机字符串 LogHelper.WeChatLog("论寻-请求:out_trade_no:" + request.Out_trade_no); WxPayData queryResult = WxPayApi.OrderQuery(data, sceneryDomain.WeChat); //调用统一下单接口 LogHelper.WeChatLog(string.Format("论寻-结果:return_code:{0},result_code:{1},trade_state:{2}", queryResult.GetValue("return_code"), queryResult.GetValue("result_code"), queryResult.GetValue("trade_state"))); if (queryResult.GetValue("return_code").ToString() == "SUCCESS" && queryResult.GetValue("result_code").ToString() == "SUCCESS" && queryResult.GetValue("trade_state").ToString() == "SUCCESS") { var detailDao = new WeChatDetailDao(); var qrCodeDao = new WeChatQRCodeDao(); //支付成功 查询交易信息 WeChatDetailDomain detail = new WeChatDetailDomain(); detail.Out_trade_no = queryResult.GetValue("out_trade_no").ToString(); detail.Total_fee = Convert.ToInt32(queryResult.GetValue("total_fee")); //测试使用 //detail.Total_fee = 1; //需要检查数据库中是否有改数据 有的话 直接返回 var QRCodeDetail = qrCodeDao.IsExistOut_trade_no(detail.Out_trade_no, detail.Total_fee, sceneryDomain.WeChat.APPID); if (QRCodeDetail == null || QRCodeDetail.SceneryName == "-1") { LogHelper.WeChatLog("论寻:无通知参数"); } //论寻:数据已经存在,不需要插入 if (QRCodeDetail.SceneryName != "-2") { //保存微信信息 detail.SceneryName = sceneryDomain.SceneryName; detail.Creater = sceneryDomain.WeChat.APPID; detail.Updater = ""; detail.AppId = sceneryDomain.WeChat.APPID; detail.BatchNumber = QRCodeDetail.BatchNumber; detail.SceneryRate = sceneryDomain.Rate; DateTime time_end = DateTime.ParseExact(queryResult.GetValue("time_end").ToString(), "yyyyMMddHHmmss", System.Globalization.CultureInfo.CurrentCulture); detail.Time_end = time_end;//20170727172015 detail.WeChatPlayDate = Convert.ToDateTime(detail.Time_end.ToString("yyyy-MM-dd")); detail.Err_code = "Success"; detail.Err_code_des = "论寻"; detail.Openid = queryResult.GetValue("openid").ToString(); detail.Trade_type = queryResult.GetValue("trade_type").ToString(); detail.Bank_type = queryResult.GetValue("bank_type").ToString(); detail.Settlement_total_fee = Convert.ToInt32(queryResult.GetValue("settlement_total_fee")); detail.Transaction_id = queryResult.GetValue("transaction_id").ToString(); detailDao.Add(detail); } else { if (queryResult.GetValue("transaction_id") != null) { detail.Transaction_id = queryResult.GetValue("transaction_id").ToString(); } if (queryResult.GetValue("time_end") != null) { detail.Time_end = DateTime.ParseExact(queryResult.GetValue("time_end").ToString(), "yyyyMMddHHmmss", System.Globalization.CultureInfo.CurrentCulture); } LogHelper.WeChatLog("论寻:数据已经存在,不需要插入"); } queryResponse.transaction_id = detail.Transaction_id; queryResponse.time_end = detail.Time_end; result = true; } } catch (Exception ex) { LogHelper.WeChatLog(string.Format("微信 查询订单时 异常:{0}", ex.Message)); } if (result == false && request.IsLastRequest == 1) { CloseOrder(request.Out_trade_no, sceneryDomain); } return(queryResponse); }
/// <summary> /// 预创建交易 /// </summary> /// <param name="request"></param> /// <param name="sceneryDomain"></param> /// <returns></returns> public PrecreateResponse Precreate(PrecreateRequest request, SceneryDomain sceneryDomain) { AlipayQRCodeDomain qrCode = new AlipayQRCodeDomain(); qrCode.BatchNumber = request.out_trade_no; qrCode.SceneryName = sceneryDomain.SceneryName; qrCode.Creater = request.terminal_id; qrCode.Updater = request.terminal_id; qrCode.Phone = request.Phone; request.extend_params.sys_service_provid = sceneryDomain.Apipay.PID; PrecreateResponse responseAlipay = new PrecreateResponse(); try { //创建淘宝支付信息 client = new DefaultAopClient(serverUrl, sceneryDomain.Apipay.APP_ID, sceneryDomain.Apipay.APP_PRIVATE_KEY, "", version, sign_type, sceneryDomain.Apipay.ALIPAY_PUBLIC_KEY, charset); //生成商户订单号 request.out_trade_no = GenerateSerialIdService.Get(FixedPrefix.Alipay, CustomPrefix.A, sceneryDomain.SceneryTCId.ToString()).SerialId; string content = JsonConvert.SerializeObject(request); qrCode.RequestJson = content; qrCode.Out_trade_no = request.out_trade_no; LogHelper.AlipayLog(string.Format("商户订单号:{0} 请求josn:{1}", request.out_trade_no, content)); string QrCode = ""; AlipayTradePrecreateResponse payResponse = Prepay(content); //payResponse.QrCode即二维码对于的链接 //将链接用二维码工具生成二维码打印出来,顾客可以用支付宝钱包扫码支付。 if (payResponse != null) { string result = payResponse.Body; if (payResponse.Code != ResultCode.SUCCESS) { qrCode.Remark = result; } else { qrCode.Remark = payResponse.Code; } switch (payResponse.Code) { case ResultCode.SUCCESS: //预下单成功 QrCode = payResponse.QrCode; qrCode.QrCode = QrCode; LogHelper.AlipayLog(string.Format("请求成功,二维码地址:{0}", QrCode)); break; case ResultCode.FAIL: StringBuilder sb2 = new StringBuilder(); sb2.Append("{\"out_trade_no\":\"" + request.out_trade_no + "\"}"); LogHelper.AlipayLog(string.Format("请求失败,保存信息:{0}", result)); Cancel(sb2.ToString()); break; } } responseAlipay.QRCode = QrCode; responseAlipay.Out_trade_no = request.out_trade_no; qrCode.AppId = sceneryDomain.Apipay.APP_ID; } catch (Exception ex) { LogHelper.AlipayLog(string.Format("获取支付宝URL:请求失败,保存信息:{0}", ex.Message)); } finally { try { new AlipayQRCodeDao().Add(qrCode); } catch (Exception ex) { LogHelper.AlipayLog(string.Format("获取支付宝URL:新增操作日志失败:{0}", ex.Message)); } } return(responseAlipay); }
/// <summary> /// 查询订单状态 /// </summary> /// <param name="request"></param> /// <param name="sceneryDomain"></param> /// <returns></returns> public QueryResponse Query(QueryRequest request, SceneryDomain sceneryDomain) { var result = false; //创建淘宝支付信息 client = new DefaultAopClient(serverUrl, sceneryDomain.Apipay.APP_ID, sceneryDomain.Apipay.APP_PRIVATE_KEY, "", version, sign_type, sceneryDomain.Apipay.ALIPAY_PUBLIC_KEY, charset); QueryResponse queryResponse = new QueryResponse(); StringBuilder biz_content = new StringBuilder(); biz_content.Append("{\"out_trade_no\":\"" + request.Out_trade_no + "\"}"); AlipayTradeQueryRequest payRequst = new AlipayTradeQueryRequest(); payRequst.BizContent = biz_content.ToString(); Dictionary <string, string> paramsDict = (Dictionary <string, string>)payRequst.GetParameters(); AlipayTradeQueryResponse payResponse = null; LogHelper.AlipayLog(string.Format("论寻-请求josn:{0}", biz_content)); payResponse = client.Execute(payRequst); LogHelper.AlipayLog(string.Format("论寻-结果:{0}-{1}-{2}", payResponse.Code, payResponse.TradeStatus, payResponse.Body)); if (string.Compare(payResponse.Code, ResultCode.SUCCESS, false) == 0) { if (payResponse.TradeStatus == "TRADE_FINISHED" || payResponse.TradeStatus == "TRADE_SUCCESS" || payResponse.TradeStatus == "TRADE_CLOSED") { if (payResponse.TradeStatus == "TRADE_SUCCESS") { var detailDao = new AlipayDetailDao(); var qrCodeDao = new AlipayQRCodeDao(); Alipay_trade_query_response alipayDetail = JsonConvert.DeserializeObject <Alipay_trade_query_response>(payResponse.Body); //需要检查数据库中是否有改数据 有的话 直接返回 var QRCodeDetail = qrCodeDao.IsExistOut_trade_no(alipayDetail.alipay_trade_query_response.Out_trade_no, alipayDetail.alipay_trade_query_response.Total_amount , sceneryDomain.Apipay.APP_ID); if (result == null || QRCodeDetail.SceneryName == "-1") { LogHelper.AlipayLog("论寻:无通知参数"); } //论寻:数据已经存在,不需要插入 if (QRCodeDetail.SceneryName != "-2") { //保存支付宝信息 string body = payResponse.Body; alipayDetail.alipay_trade_query_response.SceneryName = sceneryDomain.SceneryName; alipayDetail.alipay_trade_query_response.Creater = sceneryDomain.Apipay.APP_ID; alipayDetail.alipay_trade_query_response.Updater = ""; alipayDetail.alipay_trade_query_response.AppId = sceneryDomain.Apipay.APP_ID; alipayDetail.alipay_trade_query_response.BatchNumber = QRCodeDetail.BatchNumber; alipayDetail.alipay_trade_query_response.SceneryRate = sceneryDomain.Rate; alipayDetail.alipay_trade_query_response.AlipayPlayDate = Convert.ToDateTime(alipayDetail.alipay_trade_query_response.Send_pay_date.ToString("yyyy-MM-dd")); detailDao.Add(alipayDetail.alipay_trade_query_response); } else { LogHelper.AlipayLog("论寻:数据已经存在,不需要插入"); } queryResponse.buyer_logon_id = alipayDetail.alipay_trade_query_response.Buyer_logon_id; queryResponse.gmt_payment = alipayDetail.alipay_trade_query_response.Send_pay_date; queryResponse.trade_no = alipayDetail.alipay_trade_query_response.Trade_no; result = true; } } } if (result == false && request.IsLastRequest == 1) { var content = new StringBuilder(); content.Append("{\"out_trade_no\":\"" + payResponse.OutTradeNo + "\"}"); biz_content = content; Cancel(content.ToString()); } return(queryResponse); }
public void ProcessNotify() { SceneryDomain sceneryDomain = new SceneryDomain(); try { WxPayData notifyData = null; WxPayData res = null; try { notifyData = GetNotifyData(sceneryDomain); } catch (WxPayException ex) { //若签名错误,则立即返回结果给微信支付后台 res = new WxPayData(); res.SetValue("return_code", "FAIL"); res.SetValue("return_msg", ex.Message); LogHelper.WeChatLog("Sign check error : " + res.ToXml()); ResponseMessage.Content = new StringContent(res.ToXml()); return; } //检查支付结果中transaction_id是否存在 if (!notifyData.IsSet("transaction_id")) { //若transaction_id不存在,则立即返回结果给微信支付后台 res = new WxPayData(); res.SetValue("return_code", "FAIL"); res.SetValue("return_msg", "支付结果中微信订单号不存在"); LogHelper.WeChatLog("The Pay result is error : " + res.ToXml()); ResponseMessage.Content = new StringContent(res.ToXml()); return; } string transaction_id = notifyData.GetValue("transaction_id").ToString(); //查询订单,判断订单真实性 var queryResult = QueryOrder(transaction_id, sceneryDomain.WeChat); if (queryResult == null) { //若订单查询失败,则立即返回结果给微信支付后台 res = new WxPayData(); res.SetValue("return_code", "FAIL"); res.SetValue("return_msg", "订单查询失败"); LogHelper.WeChatLog("Order query failure : " + res.ToXml()); ResponseMessage.Content = new StringContent(res.ToXml()); return; } //查询订单成功 else { //业务处理 var detailDao = new WeChatDetailDao(); var qrCodeDao = new WeChatQRCodeDao(); //支付成功 查询交易信息 WeChatDetailDomain detail = new WeChatDetailDomain(); detail.Out_trade_no = queryResult.GetValue("out_trade_no").ToString(); detail.Total_fee = Convert.ToInt32(queryResult.GetValue("total_fee")); //需要检查数据库中是否有改数据 有的话 直接返回 var QRCodeDetail = qrCodeDao.IsExistOut_trade_no(detail.Out_trade_no, detail.Total_fee, sceneryDomain.WeChat.APPID); if (QRCodeDetail == null || QRCodeDetail.SceneryName == "-1") { LogHelper.WeChatLog("论寻:无通知参数"); res = new WxPayData(); res.SetValue("return_code", "FAIL"); res.SetValue("return_msg", "无通知参数"); LogHelper.WeChatLog("Order query failure : " + res.ToXml()); ResponseMessage.Content = new StringContent(res.ToXml()); return; } if (QRCodeDetail.SceneryName != "-2") { //保存微信信息 detail.SceneryName = QRCodeDetail.SceneryName; detail.Creater = sceneryDomain.WeChat.APPID; detail.Updater = ""; detail.AppId = sceneryDomain.WeChat.APPID; detail.BatchNumber = QRCodeDetail.BatchNumber; detail.SceneryRate = QRCodeDetail.SceneryRate; detail.Time_end = DateTime.ParseExact(queryResult.GetValue("time_end").ToString(), "yyyyMMddHHmmss", System.Globalization.CultureInfo.CurrentCulture); detail.WeChatPlayDate = Convert.ToDateTime(detail.Time_end.ToString("yyyy-MM-dd")); detail.Err_code = "Success"; detail.Err_code_des = "异步"; detail.Openid = queryResult.GetValue("openid").ToString(); detail.Trade_type = queryResult.GetValue("trade_type").ToString(); detail.Bank_type = queryResult.GetValue("bank_type").ToString(); detail.Settlement_total_fee = Convert.ToInt32(queryResult.GetValue("settlement_total_fee")); detail.Transaction_id = queryResult.GetValue("transaction_id").ToString(); detailDao.Add(detail); } else { //论寻:数据已经存在,不需要插入 LogHelper.WeChatLog("论寻:数据已经存在,不需要插入"); } res = new WxPayData(); res.SetValue("return_code", "SUCCESS"); res.SetValue("return_msg", "OK"); LogHelper.WeChatLog("order query success : " + res.ToXml()); ResponseMessage.Content = new StringContent(res.ToXml()); } } catch (Exception ex) { LogHelper.WeChatLog("Notify 异常:" + ex.Message); WxPayData res = new WxPayData(); res.SetValue("return_code", "FAIL"); res.SetValue("return_msg", "系统异常"); LogHelper.WeChatLog("Sign check error : " + res.ToXml()); ResponseMessage.Content = new StringContent(res.ToXml()); } }