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
}
}