PublicImportDataServiceRds.cs 48 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Data;
  4. using System.Security.Cryptography;
  5. using System.Web;
  6. using System.Linq;
  7. using System.Text.RegularExpressions;
  8. using MySystem.Models;
  9. using Library;
  10. using LitJson;
  11. using System.Security.Cryptography.X509Certificates;
  12. using Org.BouncyCastle.Security;
  13. using Org.BouncyCastle.Crypto.Parameters;
  14. using System.Text;
  15. using Org.BouncyCastle.Crypto;
  16. using Org.BouncyCastle.Math;
  17. using System.Net.Http;
  18. using System.Threading.Tasks;
  19. namespace MySystem
  20. {
  21. public class PublicImportDataServiceRds
  22. {
  23. public readonly static PublicImportDataServiceRds Instance = new PublicImportDataServiceRds();
  24. private PublicImportDataServiceRds()
  25. { }
  26. public void Start(JobMqMsg jobInfo)
  27. {
  28. string data = "";
  29. try
  30. {
  31. string orderString = jobInfo.OrderString;
  32. if (!string.IsNullOrEmpty(orderString))
  33. {
  34. string key = orderString.Split(':')[1];
  35. int BrandId = int.Parse(function.CheckInt(key.Split('_')[3]));
  36. bool op = true;
  37. while (op)
  38. {
  39. data = RedisDbconn.Instance.RPop<string>(key);
  40. if (data != null)
  41. {
  42. string content = "";
  43. if (data.Contains("#cut#"))
  44. {
  45. string[] dataList = data.Replace("\r", "").Replace("\n", "").Split(new string[] { "#cut#" }, StringSplitOptions.None);
  46. JsonData jsonData = JsonMapper.ToObject(dataList[1]);
  47. if (BrandId == 1)
  48. {
  49. content = Decrypt(jsonData["param"].ToString());
  50. AppendLog(dataList[0], content, BrandId);
  51. InsertData(key, content, jobInfo, BrandId);
  52. }
  53. else if (BrandId == 2)
  54. {
  55. content = KDBDecrypt(jsonData["content"].ToString());
  56. AppendLog(dataList[0], content, BrandId);
  57. if (content.StartsWith("[") && content.EndsWith("]"))
  58. {
  59. content = content.Replace("null", "\"\"");
  60. content = content.Replace("NULL", "\"\"");
  61. JsonData list = JsonMapper.ToObject(content);
  62. for (int i = 0; i < list.Count; i++)
  63. {
  64. InsertData(key, list[i].ToJson(), jobInfo, BrandId);
  65. }
  66. }
  67. else
  68. {
  69. InsertData(key, content, jobInfo, BrandId);
  70. }
  71. }
  72. else if (BrandId == 4)
  73. {
  74. content = LSDecrypt(jsonData["data"].ToString(), jsonData["sign"].ToString());
  75. AppendLog(dataList[0], content, BrandId);
  76. InsertData(key, content, jobInfo, BrandId);
  77. }
  78. else if (BrandId == 8 || BrandId == 9)
  79. {
  80. content = HKDecrypt(jsonData["data"].ToString(), jsonData["sign"].ToString(), BrandId);
  81. AppendLog(dataList[0], content, BrandId);
  82. InsertData(key, content, jobInfo, BrandId);
  83. }
  84. else if (BrandId == 10)
  85. {
  86. content = LDDecrypt(jsonData["data"].ToString());
  87. AppendLog(dataList[0], content, BrandId);
  88. InsertData(key, content, jobInfo, BrandId);
  89. }
  90. else if (BrandId == 12)
  91. {
  92. content = dataList[1];
  93. JsonData header = JsonMapper.ToObject(dataList[0]);
  94. string signstr = header["X-Sign"][0].ToString();
  95. SortedList<string, string> dic = Newtonsoft.Json.JsonConvert.DeserializeObject<SortedList<string, string>>(content);
  96. string sign = function.BuildQueryString(dic);
  97. bool checkSign = BoxVerifySign(sign, signstr);
  98. if(checkSign)
  99. {
  100. AppendLog(dataList[0], content, BrandId);
  101. InsertData(key, content, jobInfo, BrandId);
  102. }
  103. }
  104. else
  105. {
  106. content = dataList[1];
  107. InsertData(key, content, jobInfo, BrandId);
  108. }
  109. if (dataList.Length > 2)
  110. {
  111. string fileName = dataList[2];
  112. if (System.IO.File.Exists(function.getPath("/redis/" + key + "/" + fileName + ".txt")))
  113. {
  114. System.IO.File.Delete(function.getPath("/redis/" + key + "/" + fileName + ".txt"));
  115. }
  116. }
  117. }
  118. }
  119. else
  120. {
  121. op = false;
  122. }
  123. }
  124. }
  125. // string Msg = "success";
  126. // jobInfo.Status = Msg == "success" ? 1 : 0;
  127. // jobInfo.Msg = Msg == "success" ? "执行完成" : Msg;
  128. // RabbitMQClient.Instance.SendMsg(Newtonsoft.Json.JsonConvert.SerializeObject(jobInfo), "PublicBack");
  129. }
  130. catch (Exception ex)
  131. {
  132. LogHelper.Instance.WriteLog(DateTime.Now.ToString() + "\n" + data + "\n" + ex.ToString(), "public_import_service");
  133. Start(jobInfo);
  134. }
  135. }
  136. private void AppendLog(string header, string content, int BrandId)
  137. {
  138. string BrandName = "";
  139. if (BrandId == 1)
  140. {
  141. BrandName = "金控";
  142. }
  143. else if (BrandId == 2)
  144. {
  145. BrandName = "开店宝";
  146. }
  147. else if (BrandId == 4)
  148. {
  149. BrandName = "乐刷";
  150. }
  151. else if (BrandId == 6)
  152. {
  153. BrandName = "立刷";
  154. }
  155. else if (BrandId == 8)
  156. {
  157. BrandName = "海科电签";
  158. }
  159. else if (BrandId == 9)
  160. {
  161. BrandName = "海科大POS";
  162. }
  163. else if (BrandId == 10)
  164. {
  165. BrandName = "联动电签";
  166. }
  167. else if (BrandId == 12)
  168. {
  169. BrandName = "盒易付";
  170. }
  171. LogHelper.Instance.WriteLog(DateTime.Now.ToString() + "\r\n" + header + "\r\n" + content, BrandName + "推送消息");
  172. }
  173. private void InsertData(string key, string content, JobMqMsg jobInfo, int BrandId)
  174. {
  175. string Id = DoQueue(content, jobInfo.BrandInfo, BrandId);
  176. // 商户入库
  177. if (key.Contains("_bind_") || key.Contains("_changebind_"))
  178. {
  179. int IdNum = int.Parse(Id);
  180. WebCMSEntities db = new WebCMSEntities();
  181. BindRecord bind = db.BindRecord.FirstOrDefault(m => m.Id == IdNum);
  182. if (bind != null)
  183. {
  184. // string ProductType = BrandId.ToString();
  185. // bool check = db.Merchants.Any(m => m.MerNo == bind.MerNo && m.ProductType == ProductType);
  186. // if (!check)
  187. // {
  188. db.Merchants.Add(new Merchants()
  189. {
  190. CreateDate = DateTime.Now,
  191. UpdateDate = DateTime.Now,
  192. MerNo = bind.MerNo, //商户编号
  193. MerName = bind.MerName, //商户名称
  194. AgentName = bind.AgentName, //机构名称
  195. ProductType = BrandId.ToString(), //产品类型
  196. Remark = "商户入库", //注释
  197. CreateTime = DateTime.Now, //创建时间
  198. UpdateTime = DateTime.Now, //更新时间
  199. SnNo = bind.MerSnNo, //SN号
  200. MerMobile = bind.MerNewSnNo,
  201. MerIdcardNo = bind.SeoKeyword,
  202. SeoTitle = bind.SeoTitle,
  203. Field1 = bind.MerOperateType,
  204. Field2 = bind.Field1,
  205. Status = 1,
  206. });
  207. db.SaveChanges();
  208. // }
  209. }
  210. db.Dispose();
  211. }
  212. }
  213. public void Test(JobMqMsg jobInfo, string date, int kind)
  214. {
  215. try
  216. {
  217. string orderString = jobInfo.OrderString;
  218. if (!string.IsNullOrEmpty(orderString))
  219. {
  220. string key = orderString.Split(':')[1];
  221. int BrandId = int.Parse(function.CheckInt(key.Split('_')[3]));
  222. string source = function.ReadInstance("/log/金控推送消息/" + date.Replace("-", "/") + "/content.log");
  223. string patten = "";
  224. if (kind == 1)
  225. {
  226. patten = "{.*?绑定.*?}]\"}";
  227. }
  228. else if (kind == 2)
  229. {
  230. patten = "{.*?2022年飞天系列-小宝电签.*?}";
  231. }
  232. else if (kind == 3)
  233. {
  234. patten = "{.*?otherFee.*?}";
  235. }
  236. if (!string.IsNullOrEmpty(patten))
  237. {
  238. MatchCollection mc = Regex.Matches(source, patten); //交易
  239. foreach (Match sub in mc)
  240. {
  241. string content = sub.Value;
  242. string Id = DoQueue(content, jobInfo.BrandInfo, BrandId);
  243. // 商户入库
  244. if (key.Contains("_bind_"))
  245. {
  246. int IdNum = int.Parse(Id);
  247. WebCMSEntities db = new WebCMSEntities();
  248. BindRecord bind = db.BindRecord.FirstOrDefault(m => m.Id == IdNum);
  249. if (bind != null)
  250. {
  251. string ProductType = BrandId.ToString();
  252. bool check = db.Merchants.Any(m => m.MerNo == bind.MerNo && m.ProductType == ProductType);
  253. if (!check)
  254. {
  255. db.Merchants.Add(new Merchants()
  256. {
  257. CreateDate = DateTime.Now,
  258. UpdateDate = DateTime.Now,
  259. MerNo = bind.MerNo, //商户编号
  260. MerName = bind.MerName, //商户名称
  261. AgentName = bind.AgentName, //机构名称
  262. ProductType = BrandId.ToString(), //产品类型
  263. Remark = "商户入库", //注释
  264. CreateTime = DateTime.Now, //创建时间
  265. UpdateTime = DateTime.Now, //更新时间
  266. SnNo = bind.MerSnNo, //SN号
  267. MerMobile = bind.MerNewSnNo,
  268. MerIdcardNo = bind.SeoKeyword,
  269. Status = 1,
  270. });
  271. db.SaveChanges();
  272. }
  273. }
  274. db.Dispose();
  275. }
  276. }
  277. }
  278. }
  279. }
  280. catch (Exception ex)
  281. {
  282. LogHelper.Instance.WriteLog(DateTime.Now.ToString() + ":" + ex.ToString(), "public_import_service");
  283. }
  284. }
  285. public string DoQueue(string data, Brand brand, int BrandId = 1)
  286. {
  287. if (string.IsNullOrEmpty(data))
  288. {
  289. return "0";
  290. }
  291. //数据开始入库
  292. data = data.Replace("null", "\"\"");
  293. JsonData jsonObj = JsonMapper.ToObject(data);
  294. string fields = "ProductType,";
  295. string fieldvals = BrandId + ",";
  296. fields += "SeoDescription,";
  297. fieldvals += "'" + HttpUtility.UrlEncode(data) + "',";
  298. if (!brand.IsCheck)
  299. {
  300. fields += "Status,";
  301. fieldvals += "1,";
  302. }
  303. string sourceCheckKey = "";
  304. foreach (FieldRelationTable field in brand.FieldRelation)
  305. {
  306. string fType = field.TargetFieldType;
  307. string fName = field.TargetFieldName;
  308. string sName = field.SourceFieldName;
  309. string val = "";
  310. if (sName.Contains(","))
  311. {
  312. string[] flist = sName.Split(',');
  313. if (flist.Length == 2)
  314. {
  315. if (data.Contains("\"" + flist[1] + "\""))
  316. {
  317. val = jsonObj[flist[0]][flist[1]].ToString();
  318. }
  319. }
  320. else if (flist.Length == 3)
  321. {
  322. if (data.Contains("\"" + flist[2] + "\""))
  323. {
  324. val = jsonObj[flist[0]][flist[1]][flist[2]].ToString();
  325. }
  326. }
  327. }
  328. else
  329. {
  330. if (data.Contains("\"" + sName + "\""))
  331. {
  332. val = jsonObj[sName].ToString();
  333. }
  334. }
  335. string checkFields = "," + brand.CheckKey + ",";
  336. // if (fName == brand.CheckKey)
  337. if (checkFields.Contains("," + fName + ","))
  338. {
  339. if (fType == "number")
  340. {
  341. sourceCheckKey += " and " + fName + "=" + decimal.Parse(function.CheckNum(val)) + "";
  342. }
  343. else if (fType == "date")
  344. {
  345. sourceCheckKey += " and " + fName + "='" + DateTime.Parse(val).ToString("yyyy-MM-dd HH:mm:ss") + "'";
  346. }
  347. else if (fType == "timestempms")
  348. {
  349. sourceCheckKey += " and " + fName + "='" + function.ConvertIntDateTimeMini(long.Parse(val)).ToString("yyyy-MM-dd HH:mm:ss") + "'";
  350. }
  351. else if (fType == "timestemps")
  352. {
  353. sourceCheckKey += " and " + fName + "='" + function.ConvertIntDateTime(double.Parse(val)).ToString("yyyy-MM-dd HH:mm:ss") + "'";
  354. }
  355. else if (fType == "timestring")
  356. {
  357. string datetime = val.Substring(0, 4) + "-" + val.Substring(4, 2) + "-" + val.Substring(6, 2) + " " + val.Substring(8, 2) + ":" + val.Substring(10, 2) + ":" + val.Substring(12, 2);
  358. sourceCheckKey += " and " + fName + "='" + datetime + "'";
  359. }
  360. else
  361. {
  362. sourceCheckKey += " and " + fName + "='" + val + "'";
  363. }
  364. }
  365. fields += fName + ",";
  366. if (fType == "number")
  367. {
  368. fieldvals += decimal.Parse(function.CheckNum(val)) + ",";
  369. }
  370. else if (fType == "date")
  371. {
  372. fieldvals += "'" + DateTime.Parse(val).ToString("yyyy-MM-dd HH:mm:ss") + "',";
  373. }
  374. else if (fType == "timestempms")
  375. {
  376. fieldvals += "'" + function.ConvertIntDateTimeMini(long.Parse(val)).ToString("yyyy-MM-dd HH:mm:ss") + "',";
  377. }
  378. else if (fType == "timestemps")
  379. {
  380. fieldvals += "'" + function.ConvertIntDateTime(double.Parse(val)).ToString("yyyy-MM-dd HH:mm:ss") + "',";
  381. }
  382. else if (fType == "timestring")
  383. {
  384. string datetime = val.Substring(0, 4) + "-" + val.Substring(4, 2) + "-" + val.Substring(6, 2) + " " + val.Substring(8, 2) + ":" + val.Substring(10, 2) + ":" + val.Substring(12, 2);
  385. fieldvals += "'" + datetime + "',";
  386. }
  387. else
  388. {
  389. fieldvals += "'" + val + "',";
  390. }
  391. }
  392. string checksql = "select Id from " + brand.TargetTableName + DateTime.Now.ToString("yyyyMM") + " where ProductType='" + BrandId + "'" + sourceCheckKey;
  393. if(brand.TargetTableName == "TradeRecord")
  394. {
  395. // checksql = "select Id from " + brand.TargetTableName + " where Id>1520000 and ProductType='" + BrandId + "'" + sourceCheckKey;
  396. checksql = "select Id from TradeRecord" + DateTime.Now.ToString("yyyyMM") + " where Id=0";
  397. }
  398. DataTable dt = CustomerSqlConn.dtable(checksql, AppConfig.Base.RdsSqlConn);
  399. if (dt.Rows.Count < 1)
  400. {
  401. fields = fields.TrimEnd(',');
  402. fieldvals = fieldvals.TrimEnd(',');
  403. if(!fields.Contains("CreateDate"))
  404. {
  405. fields += ",CreateDate";
  406. fieldvals += ",'" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "'";
  407. }
  408. string sql = "insert into " + brand.TargetTableName + DateTime.Now.ToString("yyyyMM") + " (" + fields + ") values (" + fieldvals + ");select @@IDENTITY";
  409. CustomerSqlConn.op(sql, AppConfig.Base.RdsSqlConn);
  410. DataTable result = CustomerSqlConn.dtable("select Id from " + brand.TargetTableName + DateTime.Now.ToString("yyyyMM") + " order by Id desc limit 1", AppConfig.Base.RdsSqlConn);
  411. if (result.Rows.Count > 0)
  412. {
  413. return result.Rows[0][0].ToString();
  414. }
  415. }
  416. return "0";
  417. }
  418. #region 金控
  419. // 开发环境
  420. // string clientId = "1243966544896";
  421. // string mfe88PublicKey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCy8cg6/tXbSj2i1tyi7VztwJw7uNmqc3bS6sVIZkDYhTmcXhpV17jq4j2zz/tURwX8b3MdK1A1HTR1XRd7hl0w2UF9iFk6UezByJ5tdNDoffMCGJtVSThq+MCV+WQI26tJ/ub6bm7GPrzTR79fntN+nTniRM4trjONN2WzEhHEcwIDAQAB";
  422. // string mfe88PrivateKey = "MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBALLxyDr+1dtKPaLW3KLtXO3AnDu42apzdtLqxUhmQNiFOZxeGlXXuOriPbPP+1RHBfxvcx0rUDUdNHVdF3uGXTDZQX2IWTpR7MHInm100Oh98wIYm1VJOGr4wJX5ZAjbq0n+5vpubsY+vNNHv1+e036dOeJEzi2uM403ZbMSEcRzAgMBAAECgYAeRbb4/AmTypB4zt6OlZdGBXKoy9HO+y+b6OmtINdRieBAKs9LvG3lFpcXp1S+YjGKDhSsV5p/EczBGhmR5R44j52886h6OoU0HskifeEJs152gMXLEFya/1QWnf1Ev+ugzuto+CxuHlGHE0T43uFkuATZp4sfXX/03um99FIKmQJBAOrYJX+VmKdNbmwNKMXkFBAw6FM4wrtr6vT3ne0pBWgbUDIH8cs83wq/SQHuvy/Cafqr8qWC9fFX2m+hllzxzA0CQQDDEIDNXdRxEmRVQ90lnn6ppnERvLhTY3RyuyOj3aqM1lxWEU2vvylimCpccTEqgY/PqMwfqChSf2v3S2CFjzJ/AkAPw2ho8vKnMDRcPlnhRpjuKUo+4812ZR0FSmWoWJuLTGIKqavaN4DFKOfOoGbm3sbcU5Ra9bpqc7ouygrcvEI1AkB8uqbBqsfW7X2+j8Bu96Picw1F3Di5CZVCb6tgcrNFjyRH3JSiVkfuRYKAzdg0Z9g/Xp33eB0gc13kKQy1GlWdAkB6Emn94YesoHda26HWbrgBy18KSfcLH57EuXquX/pOma1TXjaXw1E7kkFz1EPde9WzuSWUmGN2AdJT0ruTOb4C";
  423. // string clientPublicKey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCb861uuey1252WdS8KPeBB+vm5AIBEKclsfBzVLY1cZXiiEbInCmsqT6fSO+A6wjWyJixGCzZICmUxhdBzuo3Du2YTbuo+fRlV6DW1mbguBV8/l2+LJvht0jl87J8N4skFUzvAeYKpWDX6dC6cLzjm5nyI1OrCQq0lsWPEMDCNAwIDAQAB";
  424. // string clientPrivateKey = "MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAJvzrW657LXbnZZ1Lwo94EH6+bkAgEQpyWx8HNUtjVxleKIRsicKaypPp9I74DrCNbImLEYLNkgKZTGF0HO6jcO7ZhNu6j59GVXoNbWZuC4FXz+Xb4sm+G3SOXzsnw3iyQVTO8B5gqlYNfp0LpwvOObmfIjU6sJCrSWxY8QwMI0DAgMBAAECgYAjE0dqo/6NWHu1H14ZG5mYvW31Ihu3OP7Im5GQkNI+ecQMD5bWGQ3JUmkYa8ce8BdLnjJO/q6SvWPNI5+ip87CYPH1SMXKUiSLzaCrw4xMySW9PSnudTzJwhrmlmyjYTAg70tHf2YQC4YkNvtkR+PJ2yf6JEKGFVgP5p2KyeKXgQJBANjGryxyu95QC3jIaggcYmGD36sVO/ns8Uyu8PkAHYOscuXRcV0L8LghIzPolcehj9bTbDLjiuNgeuyjNs2YBvMCQQC4K4uIXt0kVDLYzlJfhN1CsV90vQitcKdD8wTO0JRKfMCQ6UDSumU7lq+z4TxTlRYxmZjpgIqH+N0WohmEiwWxAkBEfuMzBD3gjSJS0+DNF0ruzSCLinYdDoVgWZbC1wp8ZK0ZeQh9AhzZ0X6yFDffkGlG1B9IJSXpmr68rwXOCM+JAkBkrKEUxc6bGk/FRluvDWEqIO2uUdtZfBhjQ4ggSdKWOUXGsUsXJn9KKKAZc4lXo0rDiFQXaIXRuE+bHLdYReqxAkAj0Kol0LkJgdl2PoBAeyQHTpt9nxaeNX56W7CN/srBA1O2wr+aoQiJaKsu9I0EeW3zaMJlLi3VyjU4wnF+yAsB";
  425. // 生产环境
  426. string clientId = "4487378308096";
  427. string mfe88PublicKey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC2HxPVZ5ZIxIWfr24qB45PAz9WfjN9CiF1x9Lz3P/tVvIXFdBaUw+9zxCAPRDGQxJId7anjEjCOuAIKpFOiTPhVqHTHd3075FFsW5fL7lFCOFJELTj+mVamAIbKalAuRzIX0m0VQUXd+madB+yRQSBjkOIboAMYQ9amf99SqI9KwIDAQAB";
  428. string clientPublicKey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCrSrNKkBt/X8Fkd7viGpTMk+GdJgE+SvoA4PSjccpZoLWnwxXsC8K/7pfm9uGxPjte9e4RznXE5nuhSrcfls4lDWhTrGd/lj3Id8OCM+yEG+xilJs1lvXJjHDhL6/wa+TE5NSzWoKgXnyeHF3TSHMbUefLLtoKqL3j4h4lPqrjiQIDAQAB";
  429. string clientPrivateKey = "MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAKtKs0qQG39fwWR3u+IalMyT4Z0mAT5K+gDg9KNxylmgtafDFewLwr/ul+b24bE+O1717hHOdcTme6FKtx+WziUNaFOsZ3+WPch3w4Iz7IQb7GKUmzWW9cmMcOEvr/Br5MTk1LNagqBefJ4cXdNIcxtR58su2gqovePiHiU+quOJAgMBAAECgYBQIIyIR6slRWTRG5V/KlIK9O5oNbwFKMuUF6c4weUXUi9Hv+GEXugGIpVaTIi9AdCCFmb8W2kJ54tTowDQvRnGxVpr7repYwJv2jHh5ug3oreBghfbfbaOaRMXisp2x1CLi+8Q5BNjpe9KdurRtg7jt8bqgWels5aV2PbjPHHwBQJBANjqYXbapz6xUPdI0kyEQhdxHt7jOmysTY3vT+/UcgU2sf37hWh8JlTtVlFZns3JBocc9rMtBEAh0Cy5faMQXKMCQQDKJ9eYWQvb1GyB5IdDlkOuByyuwFfosZ0Qp+QNtnz1VAHHgQRM7RGNv3nYDJNEJ+qIhIzZppG5yDbAN7PYyTXjAkEAq8a4VkIDbZ9HyfxOJbAbEqtPUhzJ+KNea0cXm4o2nTBaNhLH7B1c0aZ908BQBRDr7XWfW/cLRapBTBm8h7R+VwJBAJAKrZMPN+TuSlaPaFYfNqBE2nC1+q2CCQE6L8QZmJYRwqbN5iuN7CkNGxt3cmNo8bNOhzH6fvFamLCDwDEixbMCQEgaxfAxpJdMoR6LrklSkigHiKfA6SaRWxxShFtBfjk5XcakmLkU/U5lgD/Blu7h4x6bRf4VPTYWdbxtiOK11rY=";
  430. string reqUrl = "https://push.mfe88.com/push-service/api/SETSERVICEFEE";
  431. string reqUrl2 = "https://push.mfe88.com/push-service/api/MODIFYPERPOSFEE";
  432. public bool Verify()
  433. {
  434. string data = "ZV0BBQ2hNgeZKKAPZ3XXEJGhp/h3+Mq5ejxuCI9SRbrDRls0XtfJRWboT5+J1sfHkb/J3eI4ThkTI/DjRNLK4x7fFYD62coClL7zDXeES42RXrpBik7VHHllUIS5nZFT23QME8kxRdo/6FH7Sv0J7IP5Qtqe70b3syv1jXmv8JozoP6DQjqHnlggpRM+4Ppks5PXorvHW7yI3uOgJL06t0GWDZIh7FRQ6UU41ayDsY0Z8j9o5quD8DSGJ1po6YPdmr2FpbFL5hs+buYhfEwsOwbvU5Aawbt+XuNXlU21wjeyC/8h2/yiPJSpCGjNXzzY4BBIhWDIbyxrbV+7SGIC+gNK2oQV0Ldtq9dXmljqA8e2dWsa8IaGaXmfo/85Ef2W5qIByrn42K+rA1nzhbR+L0WPGd4ugyzx6eiUl6T0oXVMaTIIoM6fndrm7RubsfNRZizrkQ+ocnAraMnGPZq84NpRp0Qs+pg8mlAIrqQ0avDutY1jGkzFXAljYGhiPvN7ntydmn2P2jgiPfh65VWumcXU+cp8d/nTD8eT/HmVbXUNMp/1ckP+VoK2wdowvgmgAruD3Fjfo8EghAfWEfuAVIsErxGxKCF17AUI8ZIqa+JYxxaA9vjxklavLmB9MAovx3JQSGXqXNNTy3LBljb1dZr3yk0ER9Qv8K4Bqc7Ti6gHHBFc7uu+wnqD7kTieMn++TpNo44MR8tGSmN6lzZKrio1czTyLLANLzzH4lBipTalGjgFnKcaNdVloW63DKkpz3qugCeBotRDdkH3T7DtYVz41lmJyLlxToeyFxXzqV0yqopR62QIghRO/vI9DpMDJclQMKEaCs9Py4qgMz2BmTqnESU42XDyNCMY5JVGpClZJgXNPmWLU0xrOu7B/tMEfThj9pNPBqNkbWQkLZ1MaSiMrfoHfQ7krt6TV6B2rhyfwrjKysXex4IHUX0nRTT55HcqQc38FlpeC4+kaTTSRs0HGMteiq+3BfDY0vHxH84x22WeN7oE7JbD/Ttd6Tn4";
  435. string signString = "cuo8Rp0Hhc1pzEkzvx3tlGV6aBhZoD3F+b1FM07IkCTQwTVzz0EzgO0auQt+Wqf9ndWERa7P9jTqHS4JKYQH+LGLXjVgQPekzrePNnIcVVFqjf3VC+xImxSxJLaChHxiF+ufDpU9symoesub51QRCPSUB3xuQ2uP2lSbVmgcjvw=";
  436. // var signer = SignerUtilities.GetSigner("SHA256withRSA");
  437. // var pubkey = Convert.FromBase64String(mfe88PublicKey);
  438. // // var pubkey = StrToToHexByte(mfe88PublicKey);
  439. // var publicKeyParam = (RsaKeyParameters)PublicKeyFactory.CreateKey(pubkey);
  440. // signer.Init(false, publicKeyParam);
  441. // var signBytes = Convert.FromBase64String(signString);
  442. // var plainBytes = Convert.FromBase64String(data);
  443. // signer.BlockUpdate(plainBytes, 0, plainBytes.Length);
  444. // return signer.VerifySignature(signBytes);
  445. var toDecryptArray = Convert.FromBase64String(data);
  446. var toSignArray = Convert.FromBase64String(signString);
  447. // var pubkey = Encoding.UTF8.GetBytes(mfe88PublicKey);
  448. // using (var x509 = new X509Certificate2(pubkey))
  449. // {
  450. // using (var rsa = x509.GetRSAPublicKey())
  451. // {
  452. // return rsa.VerifyData(toDecryptArray, toSignArray, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1);
  453. // }
  454. // }
  455. var rsa = RSA.Create();
  456. rsa.ImportRSAPublicKey(Convert.FromBase64String(mfe88PublicKey), out _);
  457. return rsa.VerifyData(toDecryptArray, toSignArray, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1);
  458. }
  459. private byte[] StrToToHexByte(string hexString)
  460. {
  461. hexString = hexString.Replace(" ", "");
  462. if ((hexString.Length % 2) != 0)
  463. hexString += " ";
  464. byte[] returnBytes = new byte[hexString.Length / 2];
  465. for (int i = 0; i < returnBytes.Length; i++)
  466. returnBytes[i] = Convert.ToByte(hexString.Substring(i * 2, 2), 16);
  467. return returnBytes;
  468. }
  469. public string Decrypt(string data)
  470. {
  471. var toDecryptArray = Convert.FromBase64String(data);
  472. var rsa2 = RSA.Create();
  473. rsa2.ImportPkcs8PrivateKey(Convert.FromBase64String(clientPrivateKey), out _);
  474. string result = "";
  475. List<byte> cache = new List<byte>();
  476. for (int i = 0; i < toDecryptArray.Length; i++)
  477. {
  478. cache.Add(toDecryptArray[i]);
  479. if ((i + 1) % 128 == 0 || i + 1 == toDecryptArray.Length)
  480. {
  481. var ContentArray = rsa2.Decrypt(cache.ToArray(), RSAEncryptionPadding.Pkcs1);
  482. result += System.Text.Encoding.UTF8.GetString(ContentArray);
  483. cache.Clear();
  484. }
  485. }
  486. return result;
  487. }
  488. public string SetDeposit(string sn, decimal serviceFee)
  489. {
  490. serviceFee = serviceFee * 100;
  491. Dictionary<string, string> headers = new Dictionary<string, string>();
  492. headers.Add("X-Client-ID", clientId);
  493. headers.Add("X-Security", "RSA");
  494. string content = "{\"sn\":\"" + sn + "\",\"serviceFee\":\"" + serviceFee.ToString("f0") + "\"}";
  495. content = Encrypt(content);
  496. string signstr = Sign(content);
  497. headers.Add("X-Sign", signstr);
  498. string req = "{\"param\":\"" + content + "\"}";
  499. string result = function.PostWebRequest(reqUrl, req, headers, "application/json");
  500. return result;
  501. }
  502. public string SetFee(string merNo, string sn, decimal fee = 0.6M)
  503. {
  504. List<SetDepositList> rateDOs = new List<SetDepositList>();
  505. rateDOs.Add(new SetDepositList()
  506. {
  507. productSubType = "2020032007vz7Ux6",
  508. updateValue = fee,
  509. updateType = 0
  510. });
  511. Dictionary<string, string> headers = new Dictionary<string, string>();
  512. headers.Add("X-Client-ID", clientId);
  513. headers.Add("X-Security", "RSA");
  514. Dictionary<string, object> obj = new Dictionary<string, object>();
  515. obj.Add("merNo", merNo);
  516. obj.Add("sn", sn);
  517. obj.Add("batchUpdateType", 2);
  518. obj.Add("rateDOs", rateDOs);
  519. string content = Newtonsoft.Json.JsonConvert.SerializeObject(obj);
  520. LogHelper.Instance.WriteLog(DateTime.Now.ToString(), "设置金控机具费率");
  521. LogHelper.Instance.WriteLog(content, "设置金控机具费率");
  522. content = Encrypt2(content);
  523. string signstr = Sign(content);
  524. headers.Add("X-Sign", signstr);
  525. string req = "{\"param\":\"" + content + "\"}";
  526. string result = function.PostWebRequest(reqUrl2, req, headers, "application/json");
  527. LogHelper.Instance.WriteLog(result, "设置金控机具费率");
  528. return result;
  529. }
  530. public Dictionary<string, object> CallBack()
  531. {
  532. string trace = function.MD5_32(Guid.NewGuid().ToString()) + function.get_Random(8);
  533. Dictionary<string, object> obj = new Dictionary<string, object>();
  534. // Dictionary<string, string> headers = new Dictionary<string, string>();
  535. // headers.Add("X-Client-ID", clientId);
  536. // headers.Add("X-Security", "RSA");
  537. string content = "{\"code\":\"0000\",\"msg\":\"OK\"}";
  538. content = Encrypt(content);
  539. // string signstr = Sign(content);
  540. // headers.Add("X-Sign", signstr);
  541. obj.Add("code", "000000");
  542. obj.Add("message", "OK");
  543. obj.Add("trace", "");
  544. obj.Add("data", content);
  545. return obj;
  546. }
  547. public string Encrypt(string data)
  548. {
  549. return new RSAHelper(RSAType.RSA, System.Text.Encoding.UTF8, "", mfe88PublicKey).Encrypt(data);
  550. }
  551. public string Encrypt2(string data)
  552. {
  553. return new RSAHelper(RSAType.RSA, System.Text.Encoding.UTF8, "", mfe88PublicKey).Encrypt2(data);
  554. }
  555. public string Sign(string data)
  556. {
  557. var toEncryptArray = System.Text.Encoding.UTF8.GetBytes(data);
  558. var rsa = RSA.Create();
  559. rsa.ImportPkcs8PrivateKey(Convert.FromBase64String(clientPrivateKey), out _);
  560. string result = "";
  561. var buffer = rsa.SignData(toEncryptArray, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1);
  562. result = Convert.ToBase64String(buffer);
  563. return result;
  564. // return new RSAHelper(RSAType.RSA, System.Text.Encoding.UTF8, clientPrivateKey, "").Sign(data);
  565. }
  566. #endregion
  567. #region 开店宝
  568. string KdbApiUrl = "https://kzy.kdb-tj.com:5055/api";
  569. string KDBAESKEY = "gvB%UOF3eBqKf!$k";
  570. // string Kdb_Rsa_PinlicKey = "MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAJzLZwTVqTU10mnPaxhTCQa89uR9hk/1MGJcKS6lpNDZaJFrXI48tTsk46jJgkXnDMqJoNIk+iLWXhKK/n8azQMCAwEAAQ==";
  571. string Kdb_Rsa_PrivateKey = "MIIBUwIBADANBgkqhkiG9w0BAQEFAASCAT0wggE5AgEAAkEAl2x9dSSCfNDik6VM2dn/SK1ONSbb7AKyXM1gHw8PMbzWN1pK7YGaPqHlIRbAeFeIvLKVeMxrji+63W6LpB0yDQIDAQABAkAfpHUnCIUYDhJ65f0EPTDCgCyqoL8uN3YMPIKMmvoC22/i7AC6zf/bWk4JdratN+gvvnjGgHQff6HH5dOQ6sbFAiEAxPYSLADzIv374J8O+LluXIcgI5zXm4r4dMtKbCmmWSsCIQDE0BRKsBcBZ9NvJ9Km+m/d1hN9v5hFT842zrkUFJmVpwIgBdYc17z3d3P7QL613NzxzkAazbNaGDvX/O4BOI9LZJ0CICrZElHgXGHV9NYyWU45H7mwLbYmzEPqx/5uqySQB4/pAiBgKYv3RGnsZ8Zm1EKAJjUX7ehdteBgPSA/UgIDZQ4oyw==";
  572. // 查询机构政策列表
  573. public string GetPolicyList()
  574. {
  575. string url = KdbApiUrl + "/marketing/plan/query/list";
  576. //[{"id":100014,"name":"韩测试营销方案(韩测试营销方案)"}]
  577. return PostKDB(url, "");
  578. }
  579. // 查询政策下的押金
  580. public string GetDepositList(string planId)
  581. {
  582. string url = KdbApiUrl + "/marketing/deposit/query/planId";
  583. string content = "{\"planId\":\"" + planId + "\"}";
  584. //[{"depositId":26,"depositName":"押0返0","amount":0.00},{"depositId":28,"depositName":"押199返199","amount":199.00},{"depositId":29,"depositName":"押299返299","amount":299.00},{"depositId":27,"depositName":"押99返99","amount":99.00}]
  585. return PostKDB(url, content);
  586. }
  587. // 修改押金接口
  588. public string ModifyDeposit(string PosSn, string depositId)
  589. {
  590. string url = KdbApiUrl + "/marketing/deposit/query/planId";
  591. string content = "{\"posSnStart\":\"" + PosSn + "\",\"posSnEnd\":\"" + PosSn + "\",\"depositId\":" + depositId + "}";
  592. return PostKDB(url, content);
  593. }
  594. public string KDBDecrypt(string data)
  595. {
  596. string result = AesDecrypt(data, KDBAESKEY);
  597. return result;
  598. }
  599. public string AesDecrypt(string str, string key)
  600. {
  601. if (string.IsNullOrEmpty(str)) return null;
  602. byte[] toEncryptArray = Convert.FromBase64String(str);
  603. System.Security.Cryptography.RijndaelManaged rm = new System.Security.Cryptography.RijndaelManaged
  604. {
  605. Key = Encoding.UTF8.GetBytes(key),
  606. Mode = System.Security.Cryptography.CipherMode.ECB,
  607. Padding = System.Security.Cryptography.PaddingMode.PKCS7,
  608. };
  609. System.Security.Cryptography.ICryptoTransform cTransform = rm.CreateDecryptor();
  610. byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
  611. return Encoding.UTF8.GetString(resultArray);
  612. }
  613. public string AesEncrypt(string str)
  614. {
  615. // if (string.IsNullOrEmpty(str)) return null;
  616. Byte[] toEncryptArray = Encoding.UTF8.GetBytes(str);
  617. System.Security.Cryptography.RijndaelManaged rm = new System.Security.Cryptography.RijndaelManaged
  618. {
  619. Key = Encoding.UTF8.GetBytes(KDBAESKEY),
  620. Mode = System.Security.Cryptography.CipherMode.ECB,
  621. Padding = System.Security.Cryptography.PaddingMode.PKCS7
  622. };
  623. System.Security.Cryptography.ICryptoTransform cTransform = rm.CreateEncryptor();
  624. Byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
  625. return Convert.ToBase64String(resultArray);
  626. }
  627. public string PostKDB(string path, string content)
  628. {
  629. string url = KdbApiUrl + path;
  630. content = PublicImportDataService.Instance.AesEncrypt(content);
  631. string timestamp = function.GetCurTimestamp().ToString();
  632. string sign = PublicImportDataService.Instance.KDBSign(content + timestamp);
  633. string req = "{\"agencyId\":\"3013890129\",\"content\":\"" + content + "\",\"timestamp\":\"" + timestamp + "\",\"sign\":\"" + sign + "\"}";
  634. string result = PostWebRequest(url, req, new Dictionary<string, string>());
  635. return result;
  636. }
  637. private string PostWebRequest(string postUrl, string paramData, Dictionary<string, string> headers)
  638. {
  639. string ret = string.Empty;
  640. try
  641. {
  642. byte[] postData = System.Text.Encoding.UTF8.GetBytes(paramData);
  643. // 设置提交的相关参数
  644. System.Net.HttpWebRequest request = System.Net.WebRequest.Create(postUrl) as System.Net.HttpWebRequest;
  645. System.Text.Encoding myEncoding = System.Text.Encoding.UTF8;
  646. request.Method = "POST";
  647. request.KeepAlive = false;
  648. request.AllowAutoRedirect = true;
  649. request.ContentType = "application/json";
  650. foreach (string key in headers.Keys)
  651. {
  652. request.Headers.Add(key, headers[key]);
  653. }
  654. request.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)";
  655. request.ContentLength = postData.Length;
  656. // 提交请求数据
  657. System.IO.Stream outputStream = request.GetRequestStream();
  658. outputStream.Write(postData, 0, postData.Length);
  659. outputStream.Close();
  660. System.Net.HttpWebResponse response;
  661. System.IO.Stream responseStream;
  662. System.IO.StreamReader reader;
  663. string srcString;
  664. response = request.GetResponse() as System.Net.HttpWebResponse;
  665. responseStream = response.GetResponseStream();
  666. reader = new System.IO.StreamReader(responseStream, System.Text.Encoding.UTF8);
  667. srcString = reader.ReadToEnd();
  668. ret = srcString; //返回值赋值
  669. reader.Close();
  670. }
  671. // catch (System.Net.WebException ex)
  672. // {
  673. // System.Net.HttpWebResponse response = (System.Net.HttpWebResponse)ex.Response;
  674. // System.IO.Stream myResponseStream = response.GetResponseStream();
  675. // //获取响应内容
  676. // System.IO.StreamReader myStreamReader = new System.IO.StreamReader(myResponseStream);
  677. // ret = myStreamReader.ReadToEnd();
  678. // myResponseStream.Close();
  679. // }
  680. catch (Exception ex)
  681. {
  682. ret = "fail";
  683. LogHelper.Instance.WriteLog(DateTime.Now.ToString() + "\r\n" + ex.ToString(), "请求开店宝API异常");
  684. }
  685. return ret;
  686. }
  687. public string KDBSign(string data)
  688. {
  689. var rsa = RSA.Create();
  690. var key = Convert.FromBase64String(Kdb_Rsa_PrivateKey);
  691. var content = Encoding.UTF8.GetBytes(data);
  692. rsa.ImportPkcs8PrivateKey(key, out _);
  693. var result = rsa.SignData(content, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1);
  694. return Convert.ToBase64String(result);
  695. // return CSRSAHelper.Sign(data, Kdb_Rsa_PrivateKey, "utf-8");
  696. }
  697. #endregion
  698. #region 乐刷
  699. string LSPrivateKey = "MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAMjld3flY+R+9WTR2MvcR9qWISdmpayL3GNGg9gvzwkXkhDI/E7rX6ndLvVuaBbLWXB+UOh+8Pfw3Gvfv3D2GHZCTzPHOKrs2tyzqC8EmMUDQaoVOI2BY4vtB7IjNe9FlLGZx62JEJrMkHKnOSQxsi+flCoexKc2t1q7kQsO2F+3AgMBAAECgYBmQ7EB/mpQOXSPYucaN0L4eW3dEbqKUBPbEV0yInwgo7f+BWGyhsyGuooZ857W46Leyd5Dy8K8ZAbAfwCD7zJZsSzWsuvWQE991f+n0V7AAnKc3h4OsHa4oITUNo2nD3PvOpWfQx8vSuQuSFQgx0ExdnywS3So16mG2X6J2k87wQJBAPTfV10MNpA1e5oRdX4D4lQ2tVyg5GW72NMhUGWct/FvgcEW3V7xZ0z/gSLfFcGI8c4LGYWRVPIsBnWFx0LSZ6ECQQDSBoqXuF/LobfFFT3D47ixL8d+qDbOJ+ro3p4+iCkdxxJ/ncaqouxsr3fBbkSWh4t+UkbbihO/isPdBwLPZihXAkAc2jwHAKtlLogTzT7UzExcs92GvoZq3klcBy7b6i1aS1M0lycaSsNrNSfYHgUIOsSTDIfDTy59ImbYbhzeaMBBAkEAyfz6i4IJt3jXmZadKWk4NkhiT6CN3OUtGjsH69Hd4UKUuuFNsMwyHzD+NqzLEA5aDOoqNXftGDjnuAnHHRn9zwJAHqPHR5ZOKDN/ujeAIUTwmFFJh8vx6ujv7UTesBbtTsFYW6bZln+X6aS2G3Kdvz3e2cxQyH8ncc0yIh64a1fqyg==";
  700. public string LSDecrypt(string data, string sign)
  701. {
  702. var toDecryptArray = Convert.FromBase64String(sign);
  703. var rsa2 = RSA.Create();
  704. rsa2.ImportPkcs8PrivateKey(Convert.FromBase64String(LSPrivateKey), out _);
  705. var ContentArray = rsa2.Decrypt(toDecryptArray, RSAEncryptionPadding.Pkcs1);
  706. string aeskey = System.Text.Encoding.UTF8.GetString(ContentArray);
  707. return AesDecrypt(data, aeskey);
  708. }
  709. #endregion
  710. #region 海科
  711. string HKPrivateKey1 = "MIICeAIBADANBgkqhkiG9w0BAQEFAASCAmIwggJeAgEAAoGBAK5iJ2q2nF+9jEnof9VYhMdbAgI0ZS4cYmgWTMW2JR61lJhR0GH+A/m6mjN9FsTS6Bq03u/+e6BKdE6VqMGk0q7asi2VZIgD59zj4HubS8EFrcb5ZprwmGLnG71cBga7V5EWnHxSB9BlbFt6rGeQiit8NSbv62NxGh1U+rAVE/a3AgMBAAECgYEApQGxpJNowls8bQ74LytUcMMX0ng7qXcoUq+PM6IX28gb9EmuMZtHrb05fjEGI3YiNGsjbNpTpqftCBMrHRjWVRgb0PDf/zD9YYrxmcP9DWKQjG5f1ygYtQBlnOPEX963Y2SXrsTKr4+szTpI8r6YqFfVbbooKVMesCBtshgg16kCQQDYHGDuCuOzULP84QvGi8z+wHNv0arFpYYxvwitntD7K3iolAh8gTDWeaC03MHruGM43ybCUi9EHhCrcVKjgpK1AkEAzpIUajdmAAwtwGg4G0v7tP/ulmpGhnALVN84gSMAc5f8D6aCnoUyle+GylwRBw9WblHBLxsOtARQIvvdphDrOwJBAIFvXc60zvQTHfoTf84G5VyfP4R1e2atYNZiqHv0Zw5IVxgAsaSAbBPI/SvWHH9mDGd/n+M6/fw6VZmZYfl0txECQQCQB3yifpPpDpTL5h7QsY8EKbqyN9GKpQ7Rk35zU/NZpawDQYcrfhXCQytJZx4cPQ53hxtae9QpoiQ58EEgLAXHAkABzJ/QDS1QfYrkP9t9X+Pny2iEuWGeIHyfsfSKQKr5pv16k1WqiIvlFRyDPl+aw5IOedkYb0vSkcU1KzjMW+Ra";
  712. string HKPrivateKey2 = "MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAIyARvyTYvGledv+4E3D8FxsS07pmzZYJkIdWxov/xApB6Mb2BVP6BkhsRyoySWbEyiYlZpx1A3b7D4yc7vD3WfB0i0cGPwMdJP/vGuzWfF2mLY0v4mJrxdXuGeWpfWnl4DP0aQS6qkUlei6f0vWS76wdpHvKUGb17Nz/f9ezr5tAgMBAAECgYBoLhn04Qil67BvKw+BOj+5GGfC7L81TamYrpHF2j8D6ZiLHnNcYjLUp8HfYVw9MT7EhFex/KNjX2ZOPDTKzpIVXofs9or1fqPYwUewBFHD9rwTrThKySdwbKrRAFNw7YXaJvMEdpPaxBBsMvfC5EdvrFejZ80TpGGfXyIXaxuC1QJBAP/6XsinJ4ZgoJj2PRPc5pWRqUssERV2w07LCPEGxxyECoyEzrTIoj7KcwSXYTSx2GGeEiSpijye9rFCHoHUNF8CQQCMg14KaLi3RjddGYatmO4SHr/IFlwpjL16rw+poOHN1WwMmex1qd3JfNab0vi5GEkFg1fAbIMRiwksvXS0ReCzAkB5/dcoJ0lV6D0BSPDIw5D8nQOieKjXotbneSmUvJctxtvEJhLg43E3HYJ9IKvJ0iv+MbgR0t63j0agKZOiagBfAkAuU3ViyynzStQf/rV3cI81LCwgpLaYAE3MMAFi9KbdvPqVoP3jwTBdKKp8z26vX8FbbvU0fNItq4BH3uKmOM+fAkAnBwxmorni7Y6Zs24pevDVqMpcF9SkOigRKsO9Lc1HuAJuxHEoPW5KeascBVe3HfYqgt4HWIxNy/d2MvpvNaWo";
  713. public string HKDecrypt(string data, string sign, int BrandId)
  714. {
  715. var toDecryptArray = Convert.FromBase64String(sign);
  716. var rsa2 = RSA.Create();
  717. string HKPrivateKey = "";
  718. if(BrandId == 8)
  719. {
  720. HKPrivateKey = HKPrivateKey1;
  721. }
  722. else if(BrandId == 9)
  723. {
  724. HKPrivateKey = HKPrivateKey2;
  725. }
  726. rsa2.ImportPkcs8PrivateKey(Convert.FromBase64String(HKPrivateKey), out _);
  727. var ContentArray = rsa2.Decrypt(toDecryptArray, RSAEncryptionPadding.Pkcs1);
  728. string aeskey = System.Text.Encoding.UTF8.GetString(ContentArray);
  729. return AesDecrypt(data, aeskey);
  730. }
  731. #endregion
  732. #region 联动
  733. //测试环境
  734. // string LDRequestUrl = "http://111.14.221.188:18066/CloudTerminalServiceAction/";
  735. // string AgentNo = "LD110014";
  736. // string LDPublicKey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC3WG04QXTzWBg2rj4BbSmnXVTqQiCk2lZ7yi2vur2LxsSc+KN0o1W9y2AkCHcFIAk2aAfMEMQYTO3HQ+F/Vcb27BNBSjnaOLfGv0PXNHKyVzC4EQLe4M5Pqd1wMl6NaZK+HnyrPBTnfsGeywhGJc1Ke96ANrydhk7UbwezydC7nQIDAQAB";
  737. // string LDPrivateKey = "MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAJwUiLkXb6zTpvNmB+zTZtuJi97/XCdGBWgiMn/2ayVEtRuarPOvMUQo0aX4Pb/JrfdFyQccXiXFGtmh/m5Mhfuj03t0pOTC4bniQAy2veytDhnRImL1xY9YjSMX+YRXI44VRcNUSefyNmBjL7V1HgbJOfnq/PmVkcBClTf1gtefAgMBAAECgYBRbYkS/34crWNJUq7JyFS+LllRounh9270r/qmtdmaXOkbmKuoinrqc11E+GjGuSJQghDp68vWaqmiZxhFVRkEqPzaesYyMJr73GB/efXhIRWWGCqQvARs3QgOFmCL2YsC/Vq7niI72mmNLC9jOUFN30vCnJH7xI2PljfQKBLwkQJBAN1/JRJmt+2ms/eeGsI/tgClciCAfHzTtAhPHRs7XL98mzk8IDGFjysKsiSacAym5e0xV1uB6ijsuAm61go4b8cCQQC0ZLVyKdUPadhzXSjyOqtk4HVzorHW6OkDCnMazL0CYLxdJOQzrpicPhww0TB397rqLC+FuGEOEcjrDnYyGQlpAkEAq4OU9VbM/h2kJg4rslcbXAzA/yH/Q7m7IuQAKeIhw7V9jShd1XsSjcXOhEGCmolyaeVXO+ixpdcH+6DNtURWaQJACh5L/ydRiBfLyEzFazDXREVC0UWi7AcMats/MZWiVGvQpPjYw/1bGghx1FsneNMwbMolsD5zUzK0LlsVTiIRYQJAZT0p0Mg3kqSaYO2JlC6fTkI9aHMJ50iDr8qLJ2JnrNFylDxxoHwKfA7GxA2KGotguGTKhw7xCp+IyrXtXiuNrQ==";
  738. //生产环境
  739. string LDRequestUrl = "http://ldys.umpay.com/service_exter/CloudTerminalServiceAction/";
  740. string AgentNo = "LD112692";
  741. string LDPublicKey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCGtWShTeFEgSSFx3PJXcjCOmS+OgtcUvPOHhpALY3Orm6t7rl1E0n3j7XlM049YwwtGRJI4OWhgrtR4/AnOMBXdyMBoKxF23uay1WQiNekzfUrTwil7/CRrQ+VlGgPe6dr3WQT2/HLbzMnJHeoIZ4KSIj/7pgAwTF4ciL1UC3awwIDAQAB";
  742. string LDPrivateKey = "MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAJwUiLkXb6zTpvNmB+zTZtuJi97/XCdGBWgiMn/2ayVEtRuarPOvMUQo0aX4Pb/JrfdFyQccXiXFGtmh/m5Mhfuj03t0pOTC4bniQAy2veytDhnRImL1xY9YjSMX+YRXI44VRcNUSefyNmBjL7V1HgbJOfnq/PmVkcBClTf1gtefAgMBAAECgYBRbYkS/34crWNJUq7JyFS+LllRounh9270r/qmtdmaXOkbmKuoinrqc11E+GjGuSJQghDp68vWaqmiZxhFVRkEqPzaesYyMJr73GB/efXhIRWWGCqQvARs3QgOFmCL2YsC/Vq7niI72mmNLC9jOUFN30vCnJH7xI2PljfQKBLwkQJBAN1/JRJmt+2ms/eeGsI/tgClciCAfHzTtAhPHRs7XL98mzk8IDGFjysKsiSacAym5e0xV1uB6ijsuAm61go4b8cCQQC0ZLVyKdUPadhzXSjyOqtk4HVzorHW6OkDCnMazL0CYLxdJOQzrpicPhww0TB397rqLC+FuGEOEcjrDnYyGQlpAkEAq4OU9VbM/h2kJg4rslcbXAzA/yH/Q7m7IuQAKeIhw7V9jShd1XsSjcXOhEGCmolyaeVXO+ixpdcH+6DNtURWaQJACh5L/ydRiBfLyEzFazDXREVC0UWi7AcMats/MZWiVGvQpPjYw/1bGghx1FsneNMwbMolsD5zUzK0LlsVTiIRYQJAZT0p0Mg3kqSaYO2JlC6fTkI9aHMJ50iDr8qLJ2JnrNFylDxxoHwKfA7GxA2KGotguGTKhw7xCp+IyrXtXiuNrQ==";
  743. public string LDEncrypt(string data)
  744. {
  745. return new RSAHelper(RSAType.RSA, System.Text.Encoding.UTF8, "", LDPublicKey).Encrypt(data);
  746. }
  747. public string LDDecrypt(string data)
  748. {
  749. var toDecryptArray = Convert.FromBase64String(data);
  750. var toKey = Convert.FromBase64String(LDPrivateKey);
  751. var rsa = RSA.Create();
  752. rsa.ImportPkcs8PrivateKey(toKey, out _);
  753. string result = "";
  754. List<byte> cache = new List<byte>();
  755. for (int i = 0; i < toDecryptArray.Length; i++)
  756. {
  757. cache.Add(toDecryptArray[i]);
  758. if ((i + 1) % 128 == 0 || i + 1 == toDecryptArray.Length)
  759. {
  760. var ContentArray = rsa.Decrypt(cache.ToArray(), RSAEncryptionPadding.Pkcs1);
  761. result += System.Text.Encoding.UTF8.GetString(ContentArray);
  762. cache.Clear();
  763. }
  764. }
  765. return result;
  766. }
  767. #endregion
  768. #region 盒易付
  769. //测试环境
  770. // string BoxPublicKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAjMQxp24mjxDTr13uPW0y+tiO1yXFGw7P/pPQ0oZKK7F6KstEaus7pLEywBZ5XRXE5jgkhR2TS7Ne7djJfbpn5yFc6pPlz3ZsOfBVeB88NEwhx6xzCGX2eqSSkO33n8w2G0xc2ss5HpYBarT00NBZWhrwOXpdRPYLOYHKVU3Rl+FA9xDw/wYfoWvrr+JSfHRGn/ENMmQFEdckAbPauKaQMrZD2kz+PRrhq56eWnCuVQPcaz/jroVT8qQEgkg2IsNy+DwfLOIqm8IySEpxnQ5wN/KvsQJc2wXDQNf9F5kvWwjoqSSP0qJS+oPRXET+zJb+WTk2y5M6AYoC9NodwsC4NwIDAQAB";
  771. //生产环境
  772. string BoxPublicKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAjmjoQirIYZBD9Qon2HkF4j/NAINXtJ7Lzq/WXxTF7t7mg7LNARt0+ZZaeWx8caq2fv5zdsGyyoInL23cBtDI5KmFfK69iA0ygQMK0WbiKqsUB1OpPbT3+9zLuadIJAznjA223lY6CIjTpdLZhaRjImNVqc60bdkx6YsQcA+xW+3r1JH4PPHb7yBEbkKIX8OhyX7U4p0TkbDkAobbjHr5YB9gmYLoSFJMOPfTtSExkv7/Y7IVR9poZAHcr3teFoAiXW3RzxelRtnXxIkl/6AUOKoL5fhr/UTUN+Q18uzNljYWr6SwnTI3EmtzgykaewWtZvV85Xdhe/BjiQ5Xor7YbwIDAQAB";
  773. public bool BoxVerifySign(string toSignStr, string signStr)
  774. {
  775. byte[] toSignByte = Encoding.Default.GetBytes(toSignStr);
  776. byte[] signByte = Convert.FromBase64String(signStr);
  777. var toKey = Convert.FromBase64String(BoxPublicKey);
  778. var rsaroot = RSA.Create();
  779. rsaroot.ImportSubjectPublicKeyInfo(toKey, out _);
  780. var publicKeyParameters = rsaroot.ExportParameters(false);
  781. using (var rsa = RSA.Create())
  782. {
  783. rsa.ImportParameters(publicKeyParameters);
  784. var sha256 = SHA256.Create();
  785. var hash = sha256.ComputeHash(toSignByte);
  786. return rsa.VerifyHash(hash, signByte, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1);
  787. }
  788. }
  789. #endregion
  790. }
  791. }