using CommonObj.lotoModel; using CommonObj.model; using Newtonsoft.Json; using System; using System.Collections.Generic; using System.IO; using System.Net; using System.Net.Http; using System.Net.Sockets; using System.Security.Cryptography; using System.Text; using System.Xml; namespace CommonObj.common { public class CommonFunction { public static string getGuiId() { string _key = Guid.NewGuid().ToString(); return _key; } public static tokenObj createToken(redisConnection _redis, string user, string pass, string channel, string type, string msisdn, string role) { tokenObj _result = new tokenObj(); string _key = Guid.NewGuid().ToString(); string _token = CustomEncryption.Encrypt(_key, _key); _result.key = _key; _result.token = _token; _result.users = user; _result.password = pass; _result.channel = channel; _result.type = type; _result.msisdn = msisdn; _result.role = role; //ghi lai token vao DB(1) int _token_timeout = _redis.TOKEN_TIMEOUT_DEFAULT; //10 phút try { int timeout_temp = Convert.ToInt16(((paramObj)getParamObjFromRedis(_redis, "TOKEN_TIME_OUT", "TOKEN_TIME_OUT", "SYSTEM")).values); if (timeout_temp > 0) _token_timeout = timeout_temp; } catch { } TimeSpan _timeSpam = new TimeSpan(0, 0, _token_timeout); _redis.setByKey(_redis.DB_INDEX_TOKEN, _token, _result.ToString(), _timeSpam); return _result; } public static bool dellToken(redisConnection _redis, string _token) { _redis.delByKey(_redis.DB_INDEX_TOKEN, _token); return true; } public static bool setToken(redisConnection _redis, tokenObj _tokenObj) { //ghi lai token vao DB(1) int _token_timeout = Convert.ToInt16(((paramObj)getParamObjFromRedis(_redis, "TOKEN_TIME_OUT", "TOKEN_TIME_OUT", "SYSTEM")).values); TimeSpan _timeSpam = new TimeSpan(0, 0, _token_timeout); _redis.setByKey(_redis.DB_INDEX_TOKEN, _tokenObj.token, _tokenObj.ToString(), _timeSpam); return true; } public static tokenObj createToken(redisConnection _redis, string user, string pass, string channel, string type, string msisdn, string role, object _obj) { tokenObj _result = new tokenObj(); string _key = Guid.NewGuid().ToString(); string _token = CustomEncryption.Encrypt(_key, _key); _result.key = _key; _result.token = _token; _result.users = user; _result.password = pass; _result.channel = channel; _result.type = type; _result.msisdn = msisdn; _result.role = role; _result.obj = _obj; //ghi lai token vao DB(1) int _token_timeout = _redis.TOKEN_TIMEOUT_DEFAULT; //10 phút try { _token_timeout = Convert.ToInt16(((paramObj)getParamObjFromRedis(_redis, "TOKEN_TIME_OUT", "TOKEN_TIME_OUT", "SYSTEM")).values); } catch { } TimeSpan _timeSpam = new TimeSpan(0, 0, _token_timeout); _redis.setByKey(_redis.DB_INDEX_TOKEN, _token, _result.ToString(), _timeSpam); return _result; } //Ham nay check token xem co bi sua doi gi ko? true public static string decryptToken(string token, string key, log4net.ILog _log) { string result = ""; try { if (string.IsNullOrEmpty(token)) return result; result = CustomEncryption.Decrypt(token, key); } catch (Exception ex) { _log.Info("Loi khi check token: " + ex.Message, ex); } _log.Info("Decrypt toke: " + token + " result:" + result); return result; } //Kiem tra xem token nay co phai la mot partner hop phap hay ko? //token sau deco thanh cong se co dang //select a.PARTNER_CODE||'_'||a.CODE||'_'||a.USERS_NAME||'_'||a.PASSWORD from LOTO_CHANNEL a public static bool checkPartnerToken(string token, string channel, string clientIp, redisConnection _redis, log4net.ILog _log) { bool result = false; //check token ko thanh cong try { //Lay ve key Encrypt thong tin cua partner string _keyEncryptPartner = getParamObjFromRedis(_redis, "KEY_ENCRYPT", "KEY_ENCRYPT", "SYSTEM").values; string _plaintext = decryptToken(token, _keyEncryptPartner, _log); _log.Info("checkPartnerToken: _keyEncryptPartner: " + _keyEncryptPartner + " _plaintext:" + _plaintext); if (string.IsNullOrEmpty(_plaintext)) { result = false; } else { //Neu deco thanh cong se tien hanh boc tach thong tin string partnerCode = _plaintext.Split('_')[0]; string code = _plaintext.Split('_')[1]; string user = _plaintext.Split('_')[2]; string pass = _plaintext.Split('_')[3]; _log.Info("checkPartnerToken: partnerCode: " + partnerCode + " code:" + code + " user:" + user + " pass:" + pass); //Lay ve channel cua partner tuong ung de so sanh ket qua channelObj _channelObj = getChannelObjFromRedis(_redis, code); if (_channelObj.partnerCode == partnerCode && _channelObj.usersName == user && _channelObj.password == pass && code == channel) { //tiep tuc check IP if (_channelObj.listIp == "*") result = true; else { if (_channelObj.listIp.IndexOf("," + clientIp + ",") > 00) result = true; else result = false; } } else { _log.Info("_channelObj.partnerCode== partnerCode && _channelObj.usersName==user && _channelObj.password==pass && code== channel bi sau. Hay kiem tra lai "); result = false; } } } catch (Exception ex) { _log.Info("Loi khi check token partner: " + ex.Message, ex); result = false; } _log.Info("Ket qua check checkPartnerToken : " + result); return result; } //Ham nay check token xem co bi sua doi gi ko? public static bool firstCheckToken(tokenObj _tokenObj, string token, log4net.ILog _log) { bool result = false; //check token ko thanh cong //Lay ve channel tuong ung try { string giaima_key = CustomEncryption.Decrypt(token, _tokenObj.key); if (string.IsNullOrEmpty(giaima_key)) { _log.Info("Token :" + token + "da bi sua doi roi nhe. Co hacker"); result = false; } else { if (giaima_key == _tokenObj.key) result = true; else result = false; } } catch (Exception ex) { _log.Info("Loi khi check token: " + ex.Message, ex); result = false; } return result; } public static bool firstCheckToken(tokenObj _tokenObj, string token) { bool result = false; //check token ko thanh cong //Lay ve channel tuong ung try { string giaima_key = CustomEncryption.Decrypt(token, _tokenObj.key); if (string.IsNullOrEmpty(giaima_key)) { //_log.Info("Token :" + token + "da bi sua doi roi nhe. Co hacker"); result = false; } else { if (giaima_key == _tokenObj.token) result = true; else result = false; } } catch (Exception ex) { //_log.Info("Loi khi check token: "+ex.Message,ex); result = false; } return result; } //ham nay kiem tra token co hop le hay ko? public static bool checkToken(string clientIp, string token, string channel, redisConnection _redis, log4net.ILog _log) { bool result = false; //check token ko thanh cong try { //1.Kiem tra xem token nay co phai cua partner nao ko? //- Neu thuc su cua partner thi tien thanh kiem tra channel,partnercode, user, pass va clientIp //- Neu ko phai cua partner thi tiep tuc kiem tra token nay co phai la mot login nao ko? // bool isPartner = checkPartnerToken(token, channel, clientIp, _redis, _log); if (isPartner) { _log.Info("the token: " + token + "la mot partner va da xac thuc thong tin dung"); result = true; return result; } else { //truong ho nay se check token nay co phai la mot login hop le ko? if (!_redis.existsByKey(_redis.DB_INDEX_TOKEN, token)) { //Truong hop nay kenh channel nay ko authen result = false; _log.Info("The token: " + token + " is not exits in redis select 1"); return result; } tokenObj _token = JsonConvert.DeserializeObject(_redis.getByKey(_redis.DB_INDEX_TOKEN, token)); string plaintext = decryptToken(token, _token.key, _log); if (string.IsNullOrEmpty(plaintext)) { result = false; _log.Info("The token: " + token + " have change"); _redis.delByKey(_redis.DB_INDEX_TOKEN, token); return result; } else { if (plaintext == _token.key && channel == _token.channel) { result = true; //truong hop xac thuc thanh cong thi se gia han them thoi gian //int _token_timeout = Convert.ToInt16(((paramObj)getParamObjFromRedis(_redis, "TOKEN_TIME_OUT", "TOKEN_TIME_OUT", "SYSTEM")).values); int _token_timeout = _redis.TOKEN_TIMEOUT_DEFAULT;//10 phút try { int timeout_temp = Convert.ToInt16(((paramObj)getParamObjFromRedis(_redis, "TOKEN_TIME_OUT", "TOKEN_TIME_OUT", "SYSTEM")).values); if (timeout_temp > 0) _token_timeout = timeout_temp; } catch { } TimeSpan _timeSpam = new TimeSpan(0, 0, _token_timeout); _redis.setKeyTimeOut(_redis.DB_INDEX_TOKEN, token, _timeSpam); return result; } else { result = false; _log.Info("Decode token success but content invalid"); return result; } } } } catch (Exception ex) { _log.Info("Lôi khi checkToken " + ex.Message, ex); } _log.Info("Ket qua Authen " + result); return result; } //ham nay kiem tra token co hop le hay ko? //Nhu vay la neu out _outTokenObj ma null thi do la check token cua mot Partner local //Neu out _outTokenObj !=null thi do la mot token xac thuc tu Internet public static bool checkToken(string clientIp, string token, string channel, redisConnection _redis, log4net.ILog _log, out tokenObj _outTokenObj) { bool result = false; //check token ko thanh cong _outTokenObj = null; try { //1.Kiem tra xem token nay co phai cua partner nao ko? //- Neu thuc su cua partner thi tien thanh kiem tra channel,partnercode, user, pass va clientIp //- Neu ko phai cua partner thi tiep tuc kiem tra token nay co phai la mot login nao ko? // bool isPartner = checkPartnerToken(token, channel, clientIp, _redis, _log); if (isPartner) { _log.Info("the token: " + token + "la mot partner va da xac thuc thong tin dung"); result = true; return result; } else { //truong ho nay se check token nay co phai la mot login hop le ko? if (!_redis.existsByKey(_redis.DB_INDEX_TOKEN, token)) { //Truong hop nay kenh channel nay ko authen result = false; _log.Info("The token: " + token + " is not exits in redis select 1"); return result; } tokenObj _token = JsonConvert.DeserializeObject(_redis.getByKey(_redis.DB_INDEX_TOKEN, token)); string plaintext = decryptToken(token, _token.key, _log); if (string.IsNullOrEmpty(plaintext)) { result = false; _log.Info("The token: " + token + " have change"); _redis.delByKey(_redis.DB_INDEX_TOKEN, token); return result; } else { if (plaintext == _token.key && channel == _token.channel) { result = true; //truong hop xac thuc thanh cong thi se gia han them thoi gian //int _token_timeout = Convert.ToInt16(((paramObj)getParamObjFromRedis(_redis, "TOKEN_TIME_OUT", "TOKEN_TIME_OUT", "SYSTEM")).values); int _token_timeout = _redis.TOKEN_TIMEOUT_DEFAULT;//10 phút try { int timeout_temp = Convert.ToInt16(((paramObj)getParamObjFromRedis(_redis, "TOKEN_TIME_OUT", "TOKEN_TIME_OUT", "SYSTEM")).values); if (timeout_temp > 0) _token_timeout = timeout_temp; } catch { } TimeSpan _timeSpam = new TimeSpan(0, 0, _token_timeout); _redis.setKeyTimeOut(_redis.DB_INDEX_TOKEN, token, _timeSpam); _outTokenObj = _token; return result; } else { result = false; _log.Info("Decode token success but content invalid"); return result; } } } } catch (Exception ex) { _log.Info("Lôi khi checkToken " + ex.Message, ex); } _log.Info("Ket qua Authen " + result); return result; } public static paramObj getParamObjFromRedis(redisConnection _redis, string code, string codeGroup, string channel) { paramObj result = new paramObj(); try { string _objSting = _redis.getByKey(_redis.DB_INDEX_PARAM_CAMPAIGN, "PARAM_" + code + "_" + codeGroup + "_" + channel); result = JsonConvert.DeserializeObject(_objSting); } catch (Exception ex) { } return result; } ////KEY="BLACK_"+TYPE+"_"+SV_ID+"_"+MSISDN //--1= Nhan vien,2=Blacklist all,3=blacklist theo dich vu,4=whitelist theo dich vu public static blacklistObj getBlackListFromRedis(redisConnection _redis, string type, string serviceId, string msisdn) { blacklistObj result = new blacklistObj(); try { string _objSting = _redis.getByKey(_redis.DB_INDEX_BLACKLIST, "BLACK_" + type + "_" + serviceId + "_" + msisdn); if (string.IsNullOrEmpty(_objSting)) return null; result = JsonConvert.DeserializeObject(_objSting); } catch (Exception ex) { } return result; } public static channelObj getChannelObjFromRedis(redisConnection _redis, string channel) { channelObj result = new channelObj(); try { string _objSting = _redis.getByKey(_redis.DB_INDEX_PARAM_CAMPAIGN, "CHANNEL_" + channel); result = JsonConvert.DeserializeObject(_objSting); } catch (Exception ex) { } return result; } public static termObj getTermObjObjFromRedis(redisConnection _redis, string gameId) { termObj result = new termObj(); try { string _objSting = _redis.getByKey(_redis.DB_INDEX_PARAM_CAMPAIGN, "TERM_" + gameId); result = JsonConvert.DeserializeObject(_objSting); } catch (Exception ex) { } return result; } public static string getErrCodeObjFromRedis(redisConnection _redis, string channel, string errCode, string langauge) { //string _channelTemp = channel; string _channelTemp = "WEB"; string _language = "0"; if (!string.IsNullOrEmpty(langauge)) _language = langauge; string _result = ""; errCodeObj _obj = new errCodeObj(); try { string _objSting = _redis.getByKey(_redis.DB_INDEX_PARAM_CAMPAIGN, "ERRCODE_" + _channelTemp + "_" + errCode); _obj = JsonConvert.DeserializeObject(_objSting); if (_language == "0") _result = _obj.msg0; else if (_language == "1") _result = _obj.msg1; else if (_language == "2") _result = _obj.msg2; else if (_language == "3") _result = _obj.msg3; else if (_language == "4") _result = _obj.msg4; else if (_language == "5") _result = _obj.msg5; else _result = _obj.msg0; } catch (Exception ex) { } return _result; } public static string getErrCodeObjFromRedis(redisConnection _redis, string channel, string errCode) { string _result = ""; errCodeObj _obj = new errCodeObj(); try { string _objSting = _redis.getByKey(_redis.DB_INDEX_PARAM_CAMPAIGN, "ERRCODE_" + channel + "_" + errCode); _obj = JsonConvert.DeserializeObject(_objSting); _result = _obj.msg0; } catch (Exception ex) { } return _result; } public static bool checkTicket(buyTicketObj _obj, out long totalMoney) { bool _result = false; totalMoney = 0; try { string gameId = _obj.gameId; int gameIdTemp; if (!int.TryParse(gameId, out gameIdTemp)) { _result = false; return _result; } if (gameIdTemp < 3 || gameIdTemp > 9) { _result = false; return _result; } foreach (ticketObj _o in _obj.ticket) { string code = _o.code; int _codeTem; if (!int.TryParse(code, out _codeTem)) { _result = false; return _result; } if (gameId == "3" && (code.Length != 2|| !IsNumber(code))) { _result = false; return _result; } if ((gameId == "3"||gameId == "4" || gameId == "7") && code.Length != 2) { _result = false; return _result; } if ((gameId == "5" || gameId == "8") && code.Length != 4) { _result = false; return _result; } if ((gameId == "6" || gameId == "9") && code.Length != 3) { _result = false; return _result; } long _money = 0; if (long.TryParse(_o.money, out _money)) { if (_money > 0) totalMoney = totalMoney + _money; else { _result = false; return _result; } } else { _result = false; return _result; } } } catch (Exception ex) { } _result = true; return _result; } //ngoai kiem tra format, con kiem tra xem trong block co ve trung hay ko? //kiem tra trong cache da mua ve nao chua? kiem trong trong DB xem co ai mua chua? //tra them ve list cac ticke da duoc buy public static bool checkTicket_THAILAN(buyTicketObj _obj, out long totalMoney) { bool _result = false; totalMoney = 0; try { string gameId = _obj.gameId; int gameIdTemp; if (!int.TryParse(gameId, out gameIdTemp)) { _result = false; return _result; } if (gameIdTemp !=1) { _result = false; return _result; } foreach (ticketObj _o in _obj.ticket) { string code = _o.code; int _codeTem; if (!int.TryParse(code, out _codeTem)) { _result = false; return _result; } if (gameId == "1" && (code.Length != 6 || !IsNumber(code))) { _result = false; return _result; } //Kiem tra xem cac ticket o dang sau co cai nao trung voi ticket code dang set ko? int count = 0; foreach (ticketObj _k in _obj.ticket) { if(code==_k.code) { count++; if(count==2) { _result = false; return _result; } } } //Khong can phai kiem tra money //se tu tinh money } } catch (Exception ex) { } _result = true; return _result; } //neu da mua la true, chua mua la false public static bool check_THAILAN_IS_BUY_CACHE(redisConnection _redis, string _code,string randomId) { bool _result = true; try { List lst_key = _redis.getAllkeyByPattern(_redis.DB_INDEX_DATA_USER, "TRANS_"); //Kiem tra lock tam thoi foreach (var _key in lst_key) { buyTicketObj data = JsonConvert.DeserializeObject(_redis.getByKey(_redis.DB_INDEX_DATA_USER, _key)); for (int i = 0; i < data.ticket.Length; i++) { if (_code == data.ticket[i].code) { return true; } } } //kiem tra cac ve da mua if (_redis.existsByKey(_redis.DB_INDEX_DATA_TICKET_UNIQUE_BUY, _code+"_"+randomId)) { return true; } } catch (Exception ex) { return true; } return false; } /// /// true: la ticket co so cuoi trung voi ticket duoc fix giai /// false: khong lien qua gi den ticket duoc fix gi /// /// /// /// public static bool IsFixTicket(redisConnection _redis, string _ticket) { bool _result = false; try { string _fix_ticket = _redis.getByKey(_redis.DB_INDEX_PARAM_CAMPAIGN, "FIX_TICKET"); if (!string.IsNullOrEmpty(_fix_ticket)) { List _list = new List(_fix_ticket.Split(',')); foreach (string _item in _list) { if (_item.Length == 6 && _ticket == _item) return true; //Vi pham vao fix ticket else { if (_ticket.Substring(_ticket.Length - _item.Length, _item.Length) == _item) { return true; //Vi pham vao fix ticket } } } } else { return true;//Truong hop nay bat buoc phai vao DB check cho an toan } } catch (Exception) { return true; //Truong hop nay bat buoc phai vao DB check cho an toan } return _result; } public static string chargeMPS_THAILAN(redisConnection _redis, string reqeust, string msisdn, string money,string mps_ip,string mps_port, log4net.ILog _log) { string _result = "-2"; //He thong nang cap -2:nang cap,0=thanh cong,1=Het tien,21=Thue bao ko active,23=Khong ton tai thue bao mpsResponse response = new mpsResponse(); try { string serviceid = string.Empty, subServiceCode = string.Empty; if (money == "199") { serviceid = "1"; subServiceCode = "POUKP_PACKAGE1"; } else if (money == "398") { serviceid = "1"; subServiceCode = "POUKP_PACKAGE2"; } else if (money == "597") { serviceid = "1"; subServiceCode = "POUKP_PACKAGE3"; } else if (money == "769") { serviceid = "1"; subServiceCode = "POUKP_PACKAGE4"; } else if (money == "955") { serviceid = "1"; subServiceCode = "POUKP_PACKAGE5"; } string data = "requestId=" + reqeust + "&msisdn=" + msisdn + "&otp=" + "&serviceid=" + serviceid + "&subServiceCode=" + subServiceCode; _log.Info("Send MPS ip :" + mps_ip + " port: " + mps_port + " data: " + data); string response111 = SocketUnSyn(data, mps_ip, Convert.ToInt32(mps_port), 600000); _log.Info("Socket respones: " + response111); response = JsonConvert.DeserializeObject(response111); _log.Info("After convert MPSRESPONSE : " + response.ToString()); if (response.responseCode == "0") { return "0"; } else if (response.responseCode == "404") { return "23"; } else if (response.responseCode == "409") { return "21"; } else if (response.responseCode == "401"|| response.responseCode == "402"|| response.responseCode == "403") { return "1"; } else { return "-2"; } } catch (Exception ex) { } return _result; } //Lay ve goi cuoc khach hang dang su dung, de biet thue bao tra truoc hay tra sau public static string chargeGWGetPackage(redisConnection _redis, string reqeust, string msisdn, log4net.ILog _log) { string _result = "unknow"; try { string xml = "\n" + " \n" + " \n" + " \n" + " \n" + " #username#\n" + " #password#\n" + " view8585\n" + " \n" + " \n" + " \n" + " 1\n" + " \n" + " \n" + " \n" + ""; string _msisdnTemp = msisdn; if (msisdn.Length > 3) { if (msisdn.Substring(0, 3) == "509") { _msisdnTemp = msisdn.Substring(3, msisdn.Length - 3); } } string topupBasicWscode = CommonFunction.getParamObjFromRedis(_redis, "CHARGE_BASIC_WSCODE", "CHARGE_BASIC_WSCODE", "SYSTEM").values; string topupBasicShortCode = CommonFunction.getParamObjFromRedis(_redis, "MT_SHORT_CODE", "MT_SHORT_CODE", "SYSTEM").values; string topupBasicUser = CommonFunction.getParamObjFromRedis(_redis, "CHARGE_BASIC_USER", "CHARGE_BASIC_USER", "SYSTEM").values; string topupBasicPass = CommonFunction.getParamObjFromRedis(_redis, "CHARGE_BASIC_PASS", "CHARGE_BASIC_PASS", "SYSTEM").values; string topupBasicUrl = CommonFunction.getParamObjFromRedis(_redis, "CHARGE_BASIC_URL", "CHARGE_BASIC_URL", "SYSTEM").values; //string input = _msisdnTemp + "|" + topupBasicShortCode + "|" + "CHARGE_NATCOM_LOTTO|1|" + money + "|" + "NATCOMLOTTO" + reqeust; xml = xml.Replace("#username#", topupBasicUser); xml = xml.Replace("#password#", topupBasicPass); //xml = xml.Replace("#wscode#", topupBasicWscode); xml = xml.Replace("#msisdn#", _msisdnTemp); _log.Info("Request :" + reqeust + ", XML: " + xml); _log.Info("View of request :" + reqeust); //string resultPost = sendPostXML(topupBasicUrl, "300000", xml); //Tra co dinh 1 ket qua cho viec test local string resultPost = "\n" + " \n" + " \n" + " \n" + " 0\n" + " success\n" + " 0|The transaction was done successfully\n" + " 0|The transaction was done successfully]]>\n" + " \n" + " \n" + " \n" + ""; _log.Info("Response :" + reqeust + ": " + resultPost); string err_code_cmd = "-2000"; string err_msg_cmd = "cmd err unknow"; if (!string.IsNullOrEmpty(resultPost)) { XmlDocument xmlDoc = new XmlDocument(); xmlDoc.LoadXml(resultPost); err_code_cmd = xmlDoc.GetElementsByTagName("error").Item(0).InnerText; err_msg_cmd = xmlDoc.GetElementsByTagName("description").Item(0).InnerText; if (err_code_cmd == "0") { string ketqua = xmlDoc.GetElementsByTagName("return").Item(0).InnerText; _log.Info("ressult view :" + ketqua); _result = ketqua.Split('|')[6]; _log.Info("The packet of msisdn :" + _msisdnTemp + " is: " + _result); } } } catch (Exception ex) { } return _result.ToUpper(); } //tru tien khac hang public static string chargeGW(redisConnection _redis, string reqeust, string msisdn, string money, log4net.ILog _log) { string _result = "-2"; //He thong nang cap -2:nang cap,0=thanh cong,1=Het tien,21=Thue bao ko active,23=Khong ton tai thue bao try { string xml = "\n" + " \n" + " \n" + " \n" + " \n" + " #username#\n" + " #password#\n" + " charge8585\n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + ""; string _msisdnTemp = msisdn; if (msisdn.Length > 3) { if (msisdn.Substring(0, 3) == "509") { _msisdnTemp = msisdn.Substring(3, msisdn.Length - 3); } } string topupBasicWscode = CommonFunction.getParamObjFromRedis(_redis, "CHARGE_BASIC_WSCODE", "CHARGE_BASIC_WSCODE", "SYSTEM").values; string topupBasicShortCode = CommonFunction.getParamObjFromRedis(_redis, "MT_SHORT_CODE", "MT_SHORT_CODE", "SYSTEM").values; string topupBasicUser = CommonFunction.getParamObjFromRedis(_redis, "CHARGE_BASIC_USER", "CHARGE_BASIC_USER", "SYSTEM").values; string topupBasicPass = CommonFunction.getParamObjFromRedis(_redis, "CHARGE_BASIC_PASS", "CHARGE_BASIC_PASS", "SYSTEM").values; string topupBasicUrl = CommonFunction.getParamObjFromRedis(_redis, "CHARGE_BASIC_URL", "CHARGE_BASIC_URL", "SYSTEM").values; string input = _msisdnTemp + "|" + topupBasicShortCode + "|" + "CHARGE_NATCOM_LOTTO|1|" + money + "|" + "NATCOMLOTTO" + reqeust; xml = xml.Replace("#username#", topupBasicUser); xml = xml.Replace("#password#", topupBasicPass); xml = xml.Replace("#wscode#", topupBasicWscode); xml = xml.Replace("#input#", input); _log.Info("Request :" + reqeust + ", XML: " + xml); //string resultPost = sendPostXML(topupBasicUrl, "300000", xml); //Tra co dinh 1 ket qua cho viec test local string resultPost = "\n" + " \n" + " \n" + " \n" + " 0\n" + " success\n" + " 0|The transaction was done successfully\n" + " 0|The transaction was done successfully]]>\n" + " \n" + " \n" + " \n" + ""; _log.Info("Response :" + reqeust + ": " + resultPost); string err_code_cmd = "-2000"; string err_msg_cmd = "cmd err unknow"; if (!string.IsNullOrEmpty(resultPost)) { XmlDocument xmlDoc = new XmlDocument(); xmlDoc.LoadXml(resultPost); err_code_cmd = xmlDoc.GetElementsByTagName("error").Item(0).InnerText; err_msg_cmd = xmlDoc.GetElementsByTagName("description").Item(0).InnerText; string errCode, errMsg; if (err_code_cmd == "0") { string ketqua = xmlDoc.GetElementsByTagName("return").Item(0).InnerText; _log.Info("ressult :" + ketqua); //He thong nang cap -2:nang cap,0=thanh cong,1=Het tien,21=Thue bao ko active,23=Khong ton tai thue bao errCode = ketqua.Split('|')[0]; errMsg = ketqua.Split('|')[1]; if (errCode == "0") _result = "0"; else if (errCode == "S-PRF-00025") _result = "21"; else if (errCode == "55") _result = "1"; else _result = "-2"; } } } catch (Exception ex) { } return _result; } //Chu y ca 2 ham cong tien nay cho tra ve 2 trang thai 0= thanh cong, -1 = that bai do trycat (trang thai nay se pending) //cong tai khoan goc public static string topupBasicAcount(redisConnection _redis, string reqeust, string msisdn, string money, out string transId, out string errCode, out string errMsg, log4net.ILog _log) { transId = reqeust; errCode = "-1"; errMsg = "Flase"; string _result = "-1"; //He thong nang cap try { string xml = "\n" + " \n" + " \n" + " \n" + " \n" + " #username#\n" + " #password#\n" + " #wscode#\n" + " \n" + " \n" + " 1\n" + " \n" + " \n" + " \n" + ""; string _msisdnTemp = msisdn; if (msisdn.Length > 3) { if (msisdn.Substring(0, 3) == "509") { _msisdnTemp = msisdn.Substring(3, msisdn.Length - 3); } } string topupBasicWscode = CommonFunction.getParamObjFromRedis(_redis, "TOPUP_BASIC_WSCODE", "TOPUP_BASIC_WSCODE", "SYSTEM").values; string topupBasicShortCode = CommonFunction.getParamObjFromRedis(_redis, "MT_SHORT_CODE", "MT_SHORT_CODE", "SYSTEM").values; string topupBasicUser = CommonFunction.getParamObjFromRedis(_redis, "TOPUP_BASIC_USER", "TOPUP_BASIC_USER", "SYSTEM").values; string topupBasicPass = CommonFunction.getParamObjFromRedis(_redis, "TOPUP_BASIC_PASS", "TOPUP_BASIC_PASS", "SYSTEM").values; string topupBasicUrl = CommonFunction.getParamObjFromRedis(_redis, "TOPUP_BASIC_URL", "TOPUP_BASIC_URL", "SYSTEM").values; string input = _msisdnTemp + "|" + topupBasicShortCode + "|" + "ADD_NATCOM_LOTTO|1|" + money + ".0|0|" + "NATCOMLOTTO" + reqeust; xml = xml.Replace("#username#", topupBasicUser); xml = xml.Replace("#password#", topupBasicPass); xml = xml.Replace("#wscode#", topupBasicWscode); xml = xml.Replace("#input#", input); _log.Info("Request :" + reqeust + ", XML: " + xml); string resultPost = sendPostXML(topupBasicUrl, "300000", xml); //Tra co dinh 1 ket qua cho viec test local //string resultPost = "\n" + // " \n" + // " \n" + // " \n" + // " 0\n" + // " success\n" + // " 0|The transaction was done successfully\n" + // " 0|The transaction was done successfully]]>\n" + // " \n" + // " \n" + // " \n" + // ""; _log.Info("Response :" + reqeust + ": " + resultPost); string err_code_cmd = "-2000"; string err_msg_cmd = "cmd err unknow"; if (!string.IsNullOrEmpty(resultPost)) { XmlDocument xmlDoc = new XmlDocument(); xmlDoc.LoadXml(resultPost); err_code_cmd = xmlDoc.GetElementsByTagName("error").Item(0).InnerText; err_msg_cmd = xmlDoc.GetElementsByTagName("description").Item(0).InnerText; if (err_code_cmd == "0") { string ketqua = xmlDoc.GetElementsByTagName("return").Item(0).InnerText; _log.Info("ressult :" + ketqua); errCode = ketqua.Split('|')[0]; errMsg = ketqua.Split('|')[1]; } } _result = "0";//neu da den day thi chac chan hoac success hoac revert. Khong bao gio pending } catch (Exception ex) { } return _result; } //Chu y ca 2 ham cong tien nay cho tra ve 2 trang thai 0= thanh cong, -1 = that bai do trycat (trang thai nay se pending) public static string topupToWallet(redisConnection _redis, string reqeust, string msisdn, string money, out string transId, out string errCode, out string errMsg, log4net.ILog _log) { transId = reqeust; errCode = "-1"; errMsg = "false"; string _result = "-1"; //truong hop nay la loi try cath nen phai pending try { string jsomPost = "{\n" + " \"partnerCode\": \"#partnerCode#\",\n" + " \"accessKey\": \"#accessKey#\",\n" + " \"requestId\": \"#requestId#\",\n" + " \"requestTime\": \"#requestTime#\",\n" + " \"requestInfo\": \"#requestInfo#\",\n" + " \"functionName\": \"#functionName#\",\n" + " \"functionParams\": \"#functionParams#\",\n" + " \"signature\": \"#signature#\"\n" + "}"; string topupWalletKeyPrivate = CommonFunction.getParamObjFromRedis(_redis, "TOPUP_WALLET_KEY_PRIVATE", "TOPUP_WALLET_KEY_PRIVATE", "SYSTEM").values; string topupWalletPartnerCode = CommonFunction.getParamObjFromRedis(_redis, "TOPUP_WALLET_PARTNER_CODE", "TOPUP_WALLET_PARTNER_CODE", "SYSTEM").values; string topupWalletUrl = CommonFunction.getParamObjFromRedis(_redis, "TOPUP_WALLET_URL", "TOPUP_WALLET_URL", "SYSTEM").values; string topupWalletContentPay = CommonFunction.getParamObjFromRedis(_redis, "TOPUP_WALLET_CONTEN_PAY", "TOPUP_WALLET_CONTEN_PAY", "SYSTEM").values; string accessKey = Sha256Hash(topupWalletKeyPrivate + reqeust); string requestTime = DateTime.Now.ToString("yyyy-MM-ddTHH:mm:ss.fff"); string functionName = "dc92836b9910aecce8f4b216eeeb5506fd8de7a12f224a8938ddd3b79c500a1e"; string _msisdnTemp = msisdn; //if (msisdn.Length > 3) //{ // if (msisdn.Substring(0, 3) == "509") // { // _msisdnTemp = msisdn.Substring(3, msisdn.Length - 3); // } //} if (msisdn.Length > 3) { if (msisdn.Substring(0, 3) != "509") { _msisdnTemp = "509" + msisdn; } } _log.Info("topup for msisdn: " + _msisdnTemp); _log.Info("topupToWallet :" + reqeust + ", _msisdnTemp: " + _msisdnTemp); string param = "{\"msisdn\":" + _msisdnTemp + ",\"amount\":" + money + "}"; string functionParams = Base64Encode(param); string signature = "{accessKey=$accessKey&functionName=$functionName&functionParams=$functionParams&partnerCode=$partnerCode&requestId=$requestId&requestInfo=$requestInfo&requestTime=$requestTime}"; signature = signature.Replace("$accessKey", accessKey); signature = signature.Replace("$functionName", functionName); signature = signature.Replace("$functionParams", functionParams); signature = signature.Replace("$partnerCode", topupWalletPartnerCode); signature = signature.Replace("$requestId", reqeust); signature = signature.Replace("$requestInfo", topupWalletContentPay); signature = signature.Replace("$requestTime", requestTime); signature = HMACSHA256Encode(signature, topupWalletKeyPrivate); jsomPost = jsomPost.Replace("#partnerCode#", topupWalletPartnerCode); jsomPost = jsomPost.Replace("#accessKey#", accessKey); jsomPost = jsomPost.Replace("#requestId#", reqeust); jsomPost = jsomPost.Replace("#requestTime#", requestTime); jsomPost = jsomPost.Replace("#requestInfo#", topupWalletContentPay); jsomPost = jsomPost.Replace("#functionName#", functionName); jsomPost = jsomPost.Replace("#functionParams#", functionParams); jsomPost = jsomPost.Replace("#signature#", signature); string strResponse = SendPost(topupWalletUrl, jsomPost, _log); //Tra ve ket qua co dinh, danh cho test local //string strResponse = "{\n" + // " \"partnerCode\": \"natcom_loto\",\n" + // " \"requestId\": \"123457430\",\n" + // " \"requestTime\": \"2022-02-18T14:06:03.547\",\n" + // " \"responseTime\": \"2022-02-18T14:06:04.678\",\n" + // " \"status\": \"200\",\n" + // " \"message\": \"OK\",\n" + // " \"result\": {\n" + // " \"phoneNumber\": \"50940825038\",\n" + // " \"responseDescription\": \"Transaction successfully!\",\n" + // " \"transactionId\": \"22021840220258\",\n" + // " \"responseCode\": \"00000\"\n" + // " }\n" + // "}"; _log.Info("Response :" + reqeust + ": " + strResponse); topupWalletResponseObj response = JsonConvert.DeserializeObject(strResponse); if (response.Status == "200") { errCode = response.Result.ResponseCode; //den day thi chac chan se ko pending, hoac la thanh cong, hoac la revert errMsg = response.Result.ResponseDescription; } _result = "0"; //khi chay den day la moi lenh da thanh cong roi. } catch (Exception ex) { _log.Info("topup exeption: " + ex.ToString(), ex); } return _result; } //-1: He thong nang cap,1= Vi ton tai va active,2=Khong ton tai vi,3= Vi khong active public static string checkExistsWallet(redisConnection _redis, string reqeust, string msisdn, log4net.ILog _log) { string _result = "-1"; //he thong nang cap try { string jsomPost = "{\n" + " \"username\": \"$user\",\n" + " \"password\": \"$pass\",\n" + " \"msisdn\": \"$msisdn\",\n" + " \"requestId\": \"$reqeust\"\n" + "}"; string TOPUP_WALLET_CHECK_USER = CommonFunction.getParamObjFromRedis(_redis, "TOPUP_WALLET_CHECK_USER", "TOPUP_WALLET_CHECK_USER", "SYSTEM").values; string TOPUP_WALLET_CHECK_PASS = CommonFunction.getParamObjFromRedis(_redis, "TOPUP_WALLET_CHECK_PASS", "TOPUP_WALLET_CHECK_PASS", "SYSTEM").values; string TOPUP_WALLET_CHECK_URL = CommonFunction.getParamObjFromRedis(_redis, "TOPUP_WALLET_CHECK_URL", "TOPUP_WALLET_CHECK_URL", "SYSTEM").values; string accessKey = Sha256Hash(TOPUP_WALLET_CHECK_PASS + reqeust); _log.Info("accessKey: " + accessKey); jsomPost = jsomPost.Replace("$user", TOPUP_WALLET_CHECK_USER); jsomPost = jsomPost.Replace("$pass", accessKey); jsomPost = jsomPost.Replace("$msisdn", msisdn); jsomPost = jsomPost.Replace("$reqeust", reqeust); _log.Info("Request :" + reqeust + ", jsomPost: " + jsomPost); string strResponse = SendPost(TOPUP_WALLET_CHECK_URL, jsomPost, _log); //Tra ve ket qua co dinh, danh cho test local //string strResponse = "{\n" + // " \"status\": \"200\",\n" + // " \"timestamp\": \"2022-02-24T05:51:56.800\",\n" + // " \"message\": \"OK\",\n" + // " \"result\": {\n" + // " \"accountState\": 1,\n" + // " \"role\": \"EU\",\n" + // " \"msisdn\": \"50940825038\",\n" + // " \"registerDate\": \"2022-01-27 22:43:01\"\n" + // " }\n" + // "}"; _log.Info("Response :" + reqeust + ": " + strResponse); //-1: He thong nang cap,1= Vi ton tai va active,2=Khong ton tai vi,3= Vi khong active walletCheckExists response = JsonConvert.DeserializeObject(strResponse); if (response.Status == "200") { if (response.Result.AccountState == "1" && response.Result.Role == "EU") _result = "1"; else if (response.Result.AccountState == "-1") _result = "2"; else _result = "3"; } } catch (Exception ex) { } return _result; } public static String SendPost(string url, string str, log4net.ILog _log) { _log.Info("start port URL: " + url); _log.Info("Reqeust: " + str); var data = new StringContent(str, Encoding.UTF8, "application/json"); //StringBuilder sb = new StringBuilder(); //sb.Append("Request: " + data); using (var client = new HttpClient()) { TimeSpan timeSpam = new TimeSpan(0, 5, 0); client.Timeout = timeSpam; var response = client.PostAsync(url, data).Result; if (response.IsSuccessStatusCode) { var responseContent = response.Content; //sb.Append("\r\nResponse: " + responseContent); //log.Debug(sb.ToString()); // by calling .Result you are synchronously reading the result string responseString = responseContent.ReadAsStringAsync().Result; _log.Info("Response: " + responseString); return responseString; } else { _log.Info("Post not succssss: " + response.IsSuccessStatusCode.ToString()); } //sb.Append("\r\nResponse: " + response); //log.Debug(sb.ToString()); return response.StatusCode.ToString(); } } public static string sendPostXML(string api_path, string timeout, string xml) { string rp = ""; try { HttpWebRequest request = (HttpWebRequest)WebRequest.Create(api_path); byte[] bytes; bytes = System.Text.Encoding.UTF8.GetBytes(xml); request.ContentType = "text/xml; encoding='utf-8'"; request.ContentLength = bytes.Length; request.Method = "POST"; request.Timeout = Convert.ToInt32(timeout); Stream requestStream = request.GetRequestStream(); requestStream.Write(bytes, 0, bytes.Length); requestStream.Close(); HttpWebResponse response; response = (HttpWebResponse)request.GetResponse(); Stream responseStream = response.GetResponseStream(); rp = new StreamReader(responseStream).ReadToEnd(); } catch (Exception ex) { } return rp; } public static bool WriteTextFile(String fileName, String t) { TextWriter textWriter; try { textWriter = new StreamWriter(fileName); } catch (Exception) { return false; } try { textWriter.WriteLine(t); } catch (Exception) { return false; } textWriter.Close(); return true; } public static string subStrBetween(string STR, string FirstString, string LastString) { string FinalString; int Pos1 = STR.IndexOf(FirstString) + FirstString.Length; int Pos2 = STR.IndexOf(LastString); FinalString = STR.Substring(Pos1, Pos2 - Pos1); return FinalString; } public static string stringRemoveFrom0ToString(string STR, string Stringkey) { string FinalString; int Pos1 = STR.IndexOf(Stringkey) + Stringkey.Length; FinalString = STR.Remove(0, Pos1); return FinalString; } public static string stringGet1CharFirstString(string STR, string Stringkey) { string FinalString; int Pos1 = STR.IndexOf(Stringkey); FinalString = STR.Substring(Pos1 - 1, 1); return FinalString; } public static string Sha256Hash(string rawData) { // Create a SHA256 using (SHA256 sha256Hash = SHA256.Create()) { // ComputeHash - returns byte array byte[] bytes = sha256Hash.ComputeHash(Encoding.UTF8.GetBytes(rawData)); // Convert byte array to a string StringBuilder builder = new StringBuilder(); for (int i = 0; i < bytes.Length; i++) { builder.Append(bytes[i].ToString("x2")); } return builder.ToString(); } } public static string Base64Encode(string plainText) { var plainTextBytes = System.Text.Encoding.UTF8.GetBytes(plainText); return System.Convert.ToBase64String(plainTextBytes); } public static string Base64Decode(string base64EncodedData) { var base64EncodedBytes = System.Convert.FromBase64String(base64EncodedData); return System.Text.Encoding.UTF8.GetString(base64EncodedBytes); } public static string HMACSHA256Encode(string input, string key) { byte[] k = Encoding.ASCII.GetBytes(key); HMACSHA256 myhmacsha256 = new HMACSHA256(k); byte[] byteArray = Encoding.ASCII.GetBytes(input); using (MemoryStream stream = new MemoryStream(byteArray)) { return byteToHex(myhmacsha256.ComputeHash(stream)); } } private static string byteToHex(byte[] hash) { return BitConverter.ToString(hash).Replace("-", "").ToLower(); } public static string ByteArrayToHexString(byte[] ba) { StringBuilder hex = new StringBuilder(ba.Length * 2); foreach (byte b in ba) { hex.AppendFormat("{0:X2}", b); } return hex.ToString(); } public static bool IsNumber(string aNumber) { int numericValue; bool isNumber = int.TryParse(aNumber, out numericValue); return isNumber; } public static string SocketUnSyn(string msg, string host, int port, int timeout) { //log4net.ILog logger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); //log4net.Config.XmlConfigurator.Configure(); string result = "-1000"; TcpClient client = null; NetworkStream stream = null; try { byte[] data = System.Text.Encoding.ASCII.GetBytes(msg); client = new TcpClient(host, port); client.SendTimeout = timeout; stream = client.GetStream(); BinaryWriter writer = new BinaryWriter(stream); writer.Write(data); String _readFromStream = String.Empty; byte[] data_read = new byte[1024]; using (MemoryStream ms = new MemoryStream()) { int numBytesRead; while ((numBytesRead = stream.Read(data_read, 0, data_read.Length)) > 0) { ms.Write(data_read, 0, numBytesRead); } _readFromStream = System.Text.Encoding.ASCII.GetString(ms.ToArray(), 0, (int)ms.Length); } //string _readFromStream = GetResponse(stream); /* data = new Byte[1024]; String responseData = String.Empty; Int32 bytes = stream.Read(data, 0, data.Length); responseData = System.Text.Encoding.ASCII.GetString(data, 0, bytes); */ // Close everything. stream.Close(); client.Close(); //Phan tich data tra ve: result = _readFromStream; } catch (ArgumentNullException e) { stream.Close(); client.Close(); return "-1000"; } catch (SocketException e) { return "-1000"; } return result; } } }