using System; using System.Configuration; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.IO; using System.Linq; using System.Text; using System.Windows.Forms; using System.ServiceModel.Configuration; using System.Text.RegularExpressions; using Newtonsoft.Json; using Newtonsoft.Json.Linq; namespace MobilePayCheck { public partial class MainForm : Form { protected static string _OracleHelperString = ConfigurationManager.AppSettings["OracleHelperString"].ToString(); protected static string _SERVERPARTCODE = ConfigurationManager.AppSettings["SERVERPARTCODE"].ToString(); protected static string _SHOPCODE = ConfigurationManager.AppSettings["SHOPCODE"].ToString(); protected static string _PayMethod = ConfigurationManager.AppSettings["PayMethod"].ToString(); Timer PayCheckTask; System.Threading.Thread MobilePayThread; MobilePayInit MobilePayInitService = new MobilePayInit(); public MainForm() { InitializeComponent(); timer1.Start(); PayCheckTask = new Timer { Interval = 60 * 60 * 1000 }; PayCheckTask.Tick += PayCheckTask_Tick; PayCheckTask.Start(); ExcuteSql(); PayCheck(); MobilePayCheck(); } private void PayCheckTask_Tick(object sender, EventArgs e) { if (MobilePayThread == null || !MobilePayThread.IsAlive) { MobilePayThread = new System.Threading.Thread(() => MobilePayCheck()) { IsBackground = true }; MobilePayThread.Start(); } } private void timer1_Tick(object sender, EventArgs e) { try { if (MobilePayInitService.PayServiceList == null || MobilePayInitService.PayServiceList.Count == 0) { string[] _PayPort; string _ServiceIP; try { _ServiceIP = ConfigurationManager.AppSettings["PayIP"].ToString(); if (string.IsNullOrWhiteSpace(_ServiceIP)) { _ServiceIP = "localhost"; } } catch { _ServiceIP = "localhost"; } try { string _strPayPort = ConfigurationManager.AppSettings["PayPort"].ToString(); if (string.IsNullOrWhiteSpace(_strPayPort)) { _PayPort = new string[] { "7080", "7081", "7082", "7083", "7084" }; } else { _PayPort = _strPayPort.Split(','); } } catch { _PayPort = new string[] { "7080", "7081", "7082", "7083", "7084" }; } MobilePayInitService.MobilePayServiceInit(_ServiceIP, _PayPort); } } catch { } //PayCheck(); PayCheckNew(); } #region MobilePay表交易校验 /// /// MobilePay表交易校验 /// /// 服务地址 private void MobilePayCheck(string serviceUrl = "http://localhost:7080/service.asmx") { try { OracleHelper _OracleHelper = new OracleHelper(_OracleHelperString.Split(',')[0], _OracleHelperString.Split(',')[1], _OracleHelperString.Split(',')[2], _OracleHelperString.Split(',')[3]); DataTable _MobilePayTable = _OracleHelper.ExcuteSqlGetDataSet( @"SELECT A.SERVERPARTCODE,A.SHOPCODE,A.MACHINECODE,A.TICKET_CODE FROM HIGHWAY_EXCHANGE.T_MOBILE_PAY A WHERE A.MOBILEPAY_DATE BETWEEN TRUNC(SYSDATE) - 3 AND SYSDATE AND A.MOBILEPAY_RESULT NOT IN(1,5,9) AND MOBILEPAY_STATE <> 1").Tables[0]; if (_MobilePayTable.Rows.Count > 0) { string _strOrderCode = ""; string _strResult = ""; List _updateList = new List(); foreach (DataRow _DataRow in _MobilePayTable.DefaultView.ToTable(true, new string[] { "SERVERPARTCODE", "SHOPCODE", "MACHINECODE" }).Rows) { string _strLeft = _DataRow["SERVERPARTCODE"].ToString() + _DataRow["SHOPCODE"].ToString() + _DataRow["MACHINECODE"].ToString().PadLeft(4, '0'); DataRow[] _MobilePayRows = _MobilePayTable.Select( string.Format(@"SERVERPARTCODE = '{0}' AND SHOPCODE = '{1}' AND MACHINECODE = '{2}'", _DataRow["SERVERPARTCODE"].ToString(), _DataRow["SHOPCODE"].ToString(), _DataRow["MACHINECODE"].ToString())); for (int i = 0; i < _MobilePayRows.Count(); i++) { _strOrderCode += (_strOrderCode == "" ? "" : ",") + _MobilePayRows[i]["TICKET_CODE"].ToString().Replace(_strLeft, ""); if ((i + 1) % 20 == 0 || (i + 1) == _MobilePayRows.Count()) { try { System.Collections.Hashtable hashtable = new System.Collections.Hashtable { { "serverPartCode", _DataRow["SERVERPARTCODE"].ToString() }, { "shopCode",_DataRow["SHOPCODE"].ToString() }, { "machineCode", _DataRow["MACHINECODE"].ToString() }, { "mobilePayOrderCode", _strOrderCode } }; _strResult = SoapWSHelper.QuerySoapWebServiceString(serviceUrl, "MobilePayCheck", hashtable); if (!String.IsNullOrWhiteSpace(_strResult)) { DataTable _tableResult = JsonHelper.JsonToDataSet(_strResult).Tables[0]; string _strTicketCode = ""; for (int n = 0; n < _tableResult.Rows.Count; n++) { _strTicketCode += (_strTicketCode == "" ? "" : ",") + "'" + _tableResult.Rows[n]["TICKETCODE"].ToString() + "'"; } if (!String.IsNullOrWhiteSpace(_strTicketCode)) { _updateList.Add(String.Format(@"UPDATE HIGHWAY_EXCHANGE.T_MOBILE_PAY SET MOBILEPAY_RESULT = 5, MOBILEPAY_STATE = 0 WHERE TICKET_CODE IN({0}) AND MOBILEPAY_RESULT NOT IN (1,5,9)", _strTicketCode)); } } } catch (Exception ex) { try { LogHelper.WriteSendLog("移动支付校验检查异常:(" + _strOrderCode + ")\n原因:" + ex.Message); } catch { } } _strOrderCode = ""; } } } if (_updateList.Count > 0) { try { _OracleHelper.ExecuteSqlTran(_updateList); } catch (Exception ex) { try { LogHelper.WriteSendLog("移动支付校验更新失败:" + ex.Message); } catch { } } } } } catch (Exception ex) { LogHelper.WriteSendLog("移动支付校验失败:" + ex.Message); } } #endregion #region 校验移动支付数据 /// /// 移动支付交易校验 /// public void PayCheckNew() { try { OracleHelper _OracleHelper = new OracleHelper(_OracleHelperString.Split(',')[0], _OracleHelperString.Split(',')[1], _OracleHelperString.Split(',')[2], _OracleHelperString.Split(',')[3]); //DataTable _DataTable = _OracleHelper.ExcuteSqlGetDataSet(@"SELECT * FROM HIGHWAY_EXCHANGE.V_MOBILEPAYCHECK").Tables[0]; DataTable _DataTable = _OracleHelper.ExcuteSqlGetDataSet( @"SELECT A.MOBILEPAY_TYPE,A.TICKET_CODE,A.TICKET_AMOUNT,A.DATA_TYPE,A.MOBILEPAY_DATE FROM HIGHWAY_EXCHANGE.V_MOBILEPAYCHECK A GROUP BY A.MOBILEPAY_TYPE,A.TICKET_CODE,A.TICKET_AMOUNT,A.DATA_TYPE,A.MOBILEPAY_DATE").Tables[0]; if (_DataTable.Rows.Count > 0) { string querypay = null, _result_desc = ""; foreach (DataRow _DataRow in _DataTable.Rows) { bool UpdateFlag = true; string Operators = "1004"; try { Operators = ConfigurationManager.AppSettings["MobilePayOperators"].ToString(); } catch { Operators = "1004"; } //先查询配置的支付方式 if (!Enum.TryParse(Operators, out MobilePayInit.MobilePayOperators _MobilePayOperators)) { _MobilePayOperators = MobilePayInit.MobilePayOperators.kwypay; } if (MobilePayInitService.PayServiceList != null && MobilePayInitService.PayServiceList.ContainsKey(_MobilePayOperators)) { try { querypay = MobilePayQuery(MobilePayInitService.PayServiceList[_MobilePayOperators], _MobilePayOperators, _DataRow); if (!string.IsNullOrWhiteSpace(querypay)) { LogHelper.WriteSendLog("数据库中缺失订单号:" + _DataRow["TICKET_CODE"].ToString() + ",查询返回结果为:" + querypay); JObject _JObject = JObject.Parse(querypay); _result_desc = _JObject["result_desc"].ToString(); if (_JObject["result_code"].ToString() == "100" && (_result_desc.ToLower() == "success" || _result_desc == "已退款")) { UpdatePay(_OracleHelper, _DataRow); //成功则不需要继续执行 continue; } else if (_JObject["result_desc"].ToString().IndexOf("未能解析此远程名称") > 0) { UpdateFlag = false; } } } catch (Exception ex) { LogHelper.WriteSendLog(ex.Message); } } #region 循环校验全部支付站点 foreach (var _PayService in MobilePayInitService.PayServiceList) { if (_PayService.Key != _MobilePayOperators) { try { querypay = MobilePayQuery(_PayService.Value, _PayService.Key, _DataRow); if (!string.IsNullOrWhiteSpace(querypay)) { LogHelper.WriteSendLog("数据库中缺失订单号:" + _DataRow["TICKET_CODE"].ToString() + ",查询返回结果为:" + querypay); JObject _JObject = JObject.Parse(querypay); _result_desc = _JObject["result_desc"].ToString(); if (_JObject["result_code"].ToString() == "100" && (_result_desc.ToLower() == "success" || _result_desc == "已退款")) { UpdateFlag = true; //成功则不需要继续执行 break; } else if (_JObject["result_code"].ToString() == "101") { //一小时以上的待支付订单则不需要继续查询 if (DateTime.TryParse(_DataRow["MOBILEPAY_DATE"].ToString(), out DateTime MobilePayDate) && MobilePayDate.AddHours(1) < DateTime.Now) { UpdateFlag = true; } else { UpdateFlag = false; } break; } else if (_JObject["result_code"].ToString() == "999" || _JObject["result_desc"].ToString().IndexOf("未能解析此远程名称") > 0) { UpdateFlag = false; } } } catch (Exception ex) { LogHelper.WriteSendLog(ex.Message); } } } #endregion if (UpdateFlag) { UpdatePay(_OracleHelper, _DataRow); } } } } catch (Exception ex) { LogHelper.WriteReceiveLog(ex.Message); } } /// /// 新版查询移动支付结果 /// /// /// /// public string MobilePayQuery(string serviceURL, MobilePayInit.MobilePayOperators mobilePayOperators, DataRow _DataRow) { //富友 if (mobilePayOperators == MobilePayInit.MobilePayOperators.fuiou) { System.Collections.Hashtable hashtable = new System.Collections.Hashtable { { "TICKETCODE", _DataRow["TICKET_CODE"].ToString() }, { "PAYTYPE", _DataRow["MOBILEPAY_TYPE"].ToString() }, { "_mchnt_cd", "" }, { "_term_id", "" }, { "InsertType", "1" } }; return SoapWSHelper.QuerySoapWebServiceString(serviceURL, "querypay", hashtable); } //付付/客无忧/威付通 else { string ticketCode = _DataRow["TICKET_CODE"].ToString(); string tradeNo = ""; string ticketPrice = _DataRow["TICKET_AMOUNT"].ToString(); string payType = _DataRow["MOBILEPAY_TYPE"].ToString(); System.Collections.Hashtable hashtable = new System.Collections.Hashtable { { "TICKETCODE", ticketCode }, { "OUT_TRADE_NO", tradeNo }, { "TICKETPRICE", ticketPrice }, { "PAYTYPE", payType }, { "TotalCount", 1 } }; return SoapWSHelper.QuerySoapWebServiceString(serviceURL, "querypaynew", hashtable); } } /// /// 获取查询结果(旧模式) /// /// 支付方式 /// 查询相关的字段 /// public string GetQueryPayResult(string _PayMethod, DataRow _DataRow) { string querypay = ""; switch (_PayMethod) { case "1": SwiftPayService.ServiceSoapClient SwiftServiceSoapClient = new SwiftPayService.ServiceSoapClient(); querypay = SwiftServiceSoapClient.querypay(_DataRow["TICKET_CODE"].ToString(), "", _DataRow["TICKET_AMOUNT"].ToString(), _DataRow["MOBILEPAY_TYPE"].ToString()); break; case "2": MobilePayService.ServiceSoapClient MobilePayServiceSoapClient = new MobilePayService.ServiceSoapClient(); querypay = MobilePayServiceSoapClient.querypay(_DataRow["TICKET_CODE"].ToString(), "", _DataRow["TICKET_AMOUNT"].ToString(), _DataRow["MOBILEPAY_TYPE"].ToString()); break; case "3": PayService.ServiceSoapClient _ServiceSoapClient = new PayService.ServiceSoapClient(); querypay = _ServiceSoapClient.querypay(_DataRow["TICKET_CODE"].ToString(), _DataRow["MOBILEPAY_TYPE"].ToString(), "", "", "1"); break; case "4": ALLinPayService.ServiceSoapClient ALLinPayServiceClient = new ALLinPayService.ServiceSoapClient(); querypay = ALLinPayServiceClient.querypaynew(_DataRow["TICKET_CODE"].ToString(), _DataRow["TICKET_CODE"].ToString(), _DataRow["TICKET_AMOUNT"].ToString(), _DataRow["MOBILEPAY_TYPE"].ToString(), 1); break; case "5": UnionPayService.ServiceSoapClient UnionPayServiceClient = new UnionPayService.ServiceSoapClient(); querypay = UnionPayServiceClient.querypaynew(_DataRow["TICKET_CODE"].ToString(), _DataRow["TICKET_CODE"].ToString(), _DataRow["TICKET_AMOUNT"].ToString(), _DataRow["MOBILEPAY_TYPE"].ToString(), 1); break; default: EShangTechService.ServiceSoapClient EServiceSoapClient = new EShangTechService.ServiceSoapClient(); querypay = EServiceSoapClient.querypay(_DataRow["TICKET_CODE"].ToString(), "", _DataRow["TICKET_AMOUNT"].ToString(), _DataRow["MOBILEPAY_TYPE"].ToString()); break; } return querypay; } public void UpdatePay(OracleHelper _OracleHelper, DataRow _DataRow) { if (_DataRow["DATA_TYPE"].ToString() == "0") { _OracleHelper.ExcuteSql("UPDATE HIGHWAY_EXCHANGE.T_MOBILE_PAY SET MOBILEPAY_DESC = 'CHECKED(" + _DataRow["TICKET_CODE"].ToString() + ")' WHERE TICKET_CODE = '" + _DataRow["TICKET_CODE"].ToString() + "' AND MOBILEPAY_TYPE = '" + _DataRow["MOBILEPAY_TYPE"].ToString() + "'"); } else { _OracleHelper.ExcuteSql("UPDATE HIGHWAY_EXCHANGE.T_SELLDATA_EXTRA SET WORKERCODE = 'CHECK' WHERE TICKETCODE = '" + _DataRow["TICKET_CODE"].ToString() + "'"); } } private void PayCheck() { try { OracleHelper _OracleHelper = new OracleHelper(_OracleHelperString.Split(',')[0], _OracleHelperString.Split(',')[1], _OracleHelperString.Split(',')[2], _OracleHelperString.Split(',')[3]); //DataTable _DataTable = _OracleHelper.ExcuteSqlGetDataSet(@"SELECT * FROM HIGHWAY_EXCHANGE.V_MOBILEPAYCHECK").Tables[0]; DataTable _DataTable = _OracleHelper.ExcuteSqlGetDataSet( @"SELECT A.MOBILEPAY_TYPE,A.TICKET_CODE,A.TICKET_AMOUNT,A.DATA_TYPE FROM HIGHWAY_EXCHANGE.V_MOBILEPAYCHECK A GROUP BY A.MOBILEPAY_TYPE,A.TICKET_CODE,A.TICKET_AMOUNT,A.DATA_TYPE").Tables[0]; if (_DataTable.Rows.Count > 0) { try { bool UpdateFlag = true; string querypay = null, _result_desc = ""; foreach (DataRow _DataRow in _DataTable.Rows) { //先查询配置的支付方式 querypay = GetQueryPayResult(_PayMethod, _DataRow); LogHelper.WriteSendLog("数据库中缺失订单号:" + _DataRow["TICKET_CODE"].ToString() + ",查询返回结果为:" + querypay); JObject _JObject = JObject.Parse(querypay); _result_desc = _JObject["result_desc"].ToString(); if (_JObject["result_code"].ToString() == "100" && (_result_desc.ToLower() == "success" || _result_desc == "已退款")) { UpdatePay(_OracleHelper, _DataRow); //成功则不需要继续执行 continue; } else if (_JObject["result_desc"].ToString().IndexOf("未能解析此远程名称") > 0) { UpdateFlag = false; } #region 循环 system.serviceModel/client 节点 ClientSection clientSection = ConfigurationManager.GetSection("system.serviceModel/client") as ClientSection; foreach (ChannelEndpointElement item in clientSection.Endpoints) { string endpointName = item.Name; int soap_num = 0; //判断最后一位是否是数字 if (Regex.IsMatch(endpointName, "[0-9]+$")) { soap_num = Convert.ToInt32(endpointName.Substring(endpointName.Length - 1, 1)); } if (soap_num != Convert.ToInt32(_PayMethod)) { querypay = GetQueryPayResult(soap_num.ToString(), _DataRow); LogHelper.WriteSendLog("数据库中缺失订单号:" + _DataRow["TICKET_CODE"].ToString() + ",查询返回结果为:" + querypay); _JObject = JObject.Parse(querypay); _result_desc = _JObject["result_desc"].ToString(); if (_JObject["result_code"].ToString() == "100" && (_result_desc.ToLower() == "success" || _result_desc == "已退款")) { UpdateFlag = true; //成功则不需要继续执行 break; } else if (_JObject["result_desc"].ToString().IndexOf("未能解析此远程名称") > 0) { UpdateFlag = false; } } } #endregion if (UpdateFlag) { UpdatePay(_OracleHelper, _DataRow); } } } catch (Exception ex) { LogHelper.WriteSendLog(ex.Message); } } } catch (Exception ex) { LogHelper.WriteReceiveLog(ex.Message); } } #endregion #region 方法 -> 执行存储过程更新 protected void ExcuteSql() { try { OracleHelper _OracleHelper = new OracleHelper(_OracleHelperString.Split(',')[0], _OracleHelperString.Split(',')[1], _OracleHelperString.Split(',')[2], _OracleHelperString.Split(',')[3]); FileInfo _FileInfo = new FileInfo("SQLString.txt"); if (_FileInfo.Exists) { string WriteTxt = File.ReadAllText("SQLString.txt", Encoding.Default); WriteTxt = WriteTxt.Replace("\r", ""); try { _OracleHelper.ExecuteSqlTran(WriteTxt.Split(new string[] { "----------" }, StringSplitOptions.RemoveEmptyEntries)); //_OracleHelper.ExcuteSql("UPDATE HIGHWAY_EXCHANGE.T_TRANSFERTOOL SET TRANSFERTOOL_DESC = '201706122152'"); _FileInfo.Delete(); } catch (Exception ex) { LogHelper.WriteSendLog(ex.Message); } } } catch (Exception ex) { LogHelper.WriteSendLog(ex.Message); } } #endregion } }