UppPay.cs 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687
  1. using HttpServices;
  2. using Newtonsoft.Json.Linq;
  3. using System;
  4. using System.Threading;
  5. using System.Threading.Tasks;
  6. using System.Windows.Forms;
  7. using UppPay.Forms;
  8. using Ini;
  9. using DGPosPay;
  10. namespace UppPay
  11. {
  12. public class UppPay
  13. {
  14. Thread thread;
  15. string errorCode = "-1";
  16. string errorMessage = "";
  17. JObject SMFormOutDataobj = new JObject();
  18. JObject result;
  19. JObject inParamsobj = new JObject();
  20. IniFile ini = new IniFile();
  21. Loading loading = new Loading();
  22. private static int _busy = 0; // 防重入闸门:支付进行中禁止再次调用
  23. //public string UPPPayControl(string inParams)
  24. //{
  25. // System.Diagnostics.Debugger.Launch();
  26. // string readData = "";
  27. // result = new JObject();
  28. // JObject jObject = new JObject();
  29. // try
  30. // {
  31. // inParamsobj = JObject.Parse(inParams);
  32. // string recordIDinfo = inParamsobj["recordIDinfo"].ToString();
  33. // var payInfo = inParamsobj["payInfo"];
  34. // var payListArr = inParamsobj["payList"];
  35. // string inPaywCode = "";
  36. // string inAuthcode = "";
  37. // if (payInfo != null)
  38. // {
  39. // inPaywCode = payInfo["paywCode"]?.ToString();
  40. // inAuthcode = payInfo["authcode"]?.ToString();
  41. // }
  42. // foreach (JObject obj in payListArr)
  43. // {
  44. // // 提取对象的属性值
  45. // string payWType = obj["payWType"]?.ToString();
  46. // string payWayCode = obj["payWayCode"]?.ToString();
  47. // string payAmt = obj["payAmt"]?.ToString();
  48. // string revTranFlag = obj["revTranFlag"]?.ToString();
  49. // if (payWType == "DGDLL")
  50. // {
  51. // //东莞光明
  52. // thread = new Thread(() => formPOSFormd(obj));
  53. // thread.SetApartmentState(ApartmentState.STA); //重点
  54. // thread.Start();
  55. // thread.Join();
  56. // if (errorCode != "0")
  57. // {
  58. // //错误退出
  59. // break;
  60. // }
  61. // }
  62. // else if (payWType == "ONLINE")
  63. // {
  64. // //线上扫码支付
  65. // string authcode = "";
  66. // if ((inPaywCode != "") && (inPaywCode == payWayCode))
  67. // {
  68. // ///前端界面传入了二维码
  69. // authcode = inAuthcode;
  70. // }
  71. // else
  72. // {
  73. // SMForm formSM = new SMForm();
  74. // JObject smreturnobj = formSMFormd(formSM);
  75. // errorCode = smreturnobj["errorCode"].ToString();
  76. // errorMessage = smreturnobj["errorMessage"].ToString();
  77. // if (errorCode != "0")
  78. // {
  79. // break;
  80. // }
  81. // authcode = smreturnobj["authcode"].ToString();
  82. // }
  83. // if (string.IsNullOrWhiteSpace(authcode))
  84. // {
  85. // errorCode = "-1";
  86. // errorMessage = "authcode 为空";
  87. // break;
  88. // }
  89. // obj.Add("authcode", authcode);
  90. // LoadingFormd();
  91. // thread = new Thread(() => payONLINE(obj));
  92. // thread.SetApartmentState(ApartmentState.STA); //重点
  93. // thread.Start();
  94. // thread.Join();
  95. // if (errorCode != "0")
  96. // {
  97. // //错误退出
  98. // break;
  99. // }
  100. // }
  101. // else
  102. // {
  103. // break;
  104. // errorCode = "-1";
  105. // errorMessage = "非第三支付方式";
  106. // }
  107. // }
  108. // }
  109. // catch (Exception ex2)
  110. // {
  111. // errorCode = "-1";
  112. // errorMessage = ex2.Message;
  113. // }
  114. // jObject.Add("errorCode", errorCode);
  115. // jObject.Add("errorMessage", errorMessage);
  116. // jObject.Add("result", result);
  117. // return jObject.ToString();
  118. //}
  119. #region 20260828 解决UI线城调用问题
  120. public string UPPPayControl(string inParams)
  121. {
  122. // 防重入:泵消息等待期间用户可能再次点支付,直接挡掉
  123. if (Interlocked.Exchange(ref _busy, 1) == 1)
  124. {
  125. JObject busyobj = new JObject();
  126. busyobj.Add("errorCode", "-1");
  127. busyobj.Add("errorMessage", "上一笔支付还在处理中,请稍候");
  128. busyobj.Add("result", new JObject());
  129. return busyobj.ToString();
  130. }
  131. JObject jObject = new JObject();
  132. try
  133. {
  134. result = new JObject();
  135. inParamsobj = JObject.Parse(inParams);
  136. string recordIDinfo = inParamsobj["recordIDinfo"].ToString();
  137. var payInfo = inParamsobj["payInfo"];
  138. var payListArr = inParamsobj["payList"];
  139. string inPaywCode = "";
  140. string inAuthcode = "";
  141. if (payInfo != null)
  142. {
  143. inPaywCode = payInfo["paywCode"]?.ToString();
  144. inAuthcode = payInfo["authcode"]?.ToString();
  145. }
  146. foreach (JObject obj in payListArr)
  147. {
  148. string payWType = obj["payWType"]?.ToString();
  149. string payWayCode = obj["payWayCode"]?.ToString();
  150. string payAmt = obj["payAmt"]?.ToString();
  151. string revTranFlag = obj["revTranFlag"]?.ToString();
  152. if (payWType == "DGDLL")
  153. {
  154. //东莞光明
  155. thread = new Thread(() => formPOSFormd(obj));
  156. thread.SetApartmentState(ApartmentState.STA); //重点
  157. thread.Start();
  158. WaitWithPump(thread); // 原来 thread.Join() 改为泵消息等待
  159. if (errorCode != "0")
  160. {
  161. //错误退出
  162. break;
  163. }
  164. }
  165. else if (payWType == "ONLINE")
  166. {
  167. //线上扫码支付
  168. string authcode = "";
  169. if ((inPaywCode != "") && (inPaywCode == payWayCode))
  170. {
  171. ///前端界面传入了二维码
  172. authcode = inAuthcode;
  173. }
  174. else
  175. {
  176. SMForm formSM = new SMForm();
  177. JObject smreturnobj = formSMFormd(formSM);
  178. errorCode = smreturnobj["errorCode"].ToString();
  179. errorMessage = smreturnobj["errorMessage"].ToString();
  180. if (errorCode != "0")
  181. {
  182. break;
  183. }
  184. authcode = smreturnobj["authcode"].ToString();
  185. }
  186. if (string.IsNullOrWhiteSpace(authcode))
  187. {
  188. errorCode = "-1";
  189. errorMessage = "authcode 为空";
  190. break;
  191. }
  192. obj.Add("authcode", authcode);
  193. // 显示 Loading(非模态,配合下方泵消息等待保持窗体响应)
  194. loading = new Loading();
  195. loading.Show();
  196. // 支付逻辑放后台线程,主线程泵消息等待
  197. thread = new Thread(() => payONLINE(obj));
  198. thread.IsBackground = true;
  199. thread.Start();
  200. WaitWithPump(thread); // 原来 thread.Join() 改为泵消息等待
  201. // 兜底关闭 Loading(worker 正常结束时已通过 SafeUI 关闭)
  202. SafeUI(() => loading.CloseLoading());
  203. if (errorCode != "0")
  204. {
  205. //错误退出
  206. break;
  207. }
  208. }
  209. else
  210. {
  211. errorCode = "-1";
  212. errorMessage = "非第三支付方式";
  213. break; // 注:原代码 break 在赋值前面,永远执行不到,这里顺手修正
  214. }
  215. }
  216. }
  217. catch (Exception ex2)
  218. {
  219. errorCode = "-1";
  220. errorMessage = ex2.Message;
  221. }
  222. finally
  223. {
  224. Interlocked.Exchange(ref _busy, 0);
  225. }
  226. jObject.Add("errorCode", errorCode);
  227. jObject.Add("errorMessage", errorMessage);
  228. jObject.Add("result", result);
  229. return jObject.ToString();
  230. }
  231. /// <summary>
  232. /// 带消息泵的等待:等待期间持续处理 Windows 消息,
  233. /// 保证 Loading 等窗体不出现“未响应”。
  234. /// </summary>
  235. private void WaitWithPump(Thread t)
  236. {
  237. while (t.IsAlive)
  238. {
  239. Application.DoEvents();
  240. Thread.Sleep(30);
  241. }
  242. Application.DoEvents(); // 新增:把 worker 排队的关闭消息处理掉
  243. }
  244. /// <summary>
  245. /// 跨线程安全更新 Loading 窗体(在 worker 线程中调用)
  246. /// </summary>
  247. private void SafeUI(MethodInvoker act)
  248. {
  249. try
  250. {
  251. if (loading != null && !loading.IsDisposed && loading.IsHandleCreated)
  252. {
  253. loading.BeginInvoke(act);
  254. }
  255. }
  256. catch (Exception)
  257. {
  258. // 窗体已被关闭/释放时忽略
  259. }
  260. }
  261. #endregion
  262. // 1. 方法签名必须改为 async Task<string>
  263. // 注意:调用这个方法的地方也需要相应调整(如果是按钮点击事件可以用 async void)
  264. //public async Task<string> UPPPayControl(string inParams)
  265. //{
  266. // // System.Diagnostics.Debugger.Launch(); // 调试时开启,发布时建议注释掉
  267. // string readData = "";
  268. // result = new JObject();
  269. // JObject jObject = new JObject();
  270. // try
  271. // {
  272. // inParamsobj = JObject.Parse(inParams);
  273. // string recordIDinfo = inParamsobj["recordIDinfo"].ToString();
  274. // var payInfo = inParamsobj["payInfo"];
  275. // var payListArr = inParamsobj["payList"];
  276. // string inPaywCode = "";
  277. // string inAuthcode = "";
  278. // if (payInfo != null)
  279. // {
  280. // inPaywCode = payInfo["paywCode"]?.ToString();
  281. // inAuthcode = payInfo["authcode"]?.ToString();
  282. // }
  283. // foreach (JObject obj in payListArr)
  284. // {
  285. // // 提取对象的属性值
  286. // string payWType = obj["payWType"]?.ToString();
  287. // string payWayCode = obj["payWayCode"]?.ToString();
  288. // string payAmt = obj["payAmt"]?.ToString();
  289. // string revTranFlag = obj["revTranFlag"]?.ToString();
  290. // if (payWType == "DGDLL")
  291. // {
  292. // // --- 东莞光明逻辑 ---
  293. // // 【修改点】使用 Task.Run 在后台线程执行,await 等待完成
  294. // // 这样主线程会去处理 Loading 动画,不会卡死
  295. // await Task.Run(() => formPOSFormd(obj));
  296. // if (errorCode != "0")
  297. // {
  298. // // 错误退出
  299. // break;
  300. // }
  301. // }
  302. // else if (payWType == "ONLINE")
  303. // {
  304. // // --- 线上扫码支付逻辑 ---
  305. // string authcode = "";
  306. // if ((inPaywCode != "") && (inPaywCode == payWayCode))
  307. // {
  308. // /// 前端界面传入了二维码
  309. // authcode = inAuthcode;
  310. // }
  311. // else
  312. // {
  313. // // 获取扫码结果
  314. // SMForm formSM = new SMForm();
  315. // // 注意:如果 formSMFormd 内部涉及 UI 操作,它必须在主线程运行
  316. // // 如果它是纯逻辑计算,可以包在 Task.Run 里;如果是弹窗,直接调用即可
  317. // JObject smreturnobj = formSMFormd(formSM);
  318. // errorCode = smreturnobj["errorCode"].ToString();
  319. // errorMessage = smreturnobj["errorMessage"].ToString();
  320. // if (errorCode != "0")
  321. // {
  322. // break;
  323. // }
  324. // authcode = smreturnobj["authcode"].ToString();
  325. // }
  326. // if (string.IsNullOrWhiteSpace(authcode))
  327. // {
  328. // errorCode = "-1";
  329. // errorMessage = "authcode 为空";
  330. // break;
  331. // }
  332. // obj.Add("authcode", authcode);
  333. // // 显示 Loading
  334. // LoadingFormd();
  335. // // 【修改点】核心修复处
  336. // // 原来:thread.Start(); thread.Join(); (这会卡死 UI)
  337. // // 现在:Task.Run 在后台跑支付逻辑,await 等待它结束
  338. // await Task.Run(() => payONLINE(obj));
  339. // if (errorCode != "0")
  340. // {
  341. // // 错误退出
  342. // break;
  343. // }
  344. // }
  345. // else
  346. // {
  347. // break; // 这里的 break 会导致下面的 errorCode 赋值无法执行,保留原样
  348. // errorCode = "-1";
  349. // errorMessage = "非第三支付方式";
  350. // }
  351. // }
  352. // }
  353. // catch (Exception ex2)
  354. // {
  355. // errorCode = "-1";
  356. // errorMessage = ex2.Message;
  357. // }
  358. // jObject.Add("errorCode", errorCode);
  359. // jObject.Add("errorMessage", errorMessage);
  360. // jObject.Add("result", result);
  361. // return jObject.ToString();
  362. //}
  363. /// <summary>
  364. /// 安全取值:字段缺失或为 null 时返回空串,而不是抛 NullReferenceException。
  365. /// 20261020 新增 —— 原代码大量使用 json["k"].ToString(),当 HIS 返回
  366. /// IRIS 原生错误结构({"errors":[...],"summary":...})时必然空引用,
  367. /// 真实报错会被外层 catch 吞成"对象引用未设置",排查时完全看不到真相。
  368. /// </summary>
  369. private string GetStr(JObject o, string key)
  370. {
  371. if (o == null) return "";
  372. JToken t;
  373. try { t = o[key]; } catch (Exception) { return ""; }
  374. if (t == null || t.Type == JTokenType.Null || t.Type == JTokenType.Undefined)
  375. {
  376. return "";
  377. }
  378. return t.ToString();
  379. }
  380. /// <summary>把关键诊断信息写入 UPPPay 日志目录。</summary>
  381. private void WriteDiag(string tag, string text)
  382. {
  383. try
  384. {
  385. IniFile tini = new IniFile();
  386. string p = tini.IniReadValue("LOG", "path");
  387. if (!string.IsNullOrWhiteSpace(p))
  388. {
  389. FileInfoClass.FileClass fc = new FileInfoClass.FileClass();
  390. fc.WriteLogFile(p, DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff") + " [DIAG][" + tag + "] " + text);
  391. }
  392. }
  393. catch (Exception) { }
  394. }
  395. private JObject payONLINE2()
  396. {
  397. SMFormOutDataobj = new JObject();
  398. loading.lblStatusText("请稍等........");
  399. try
  400. {
  401. for (int i = 0; i < 50; i++)
  402. {
  403. Thread.Sleep(500);
  404. loading.lblStatusText("" + i);
  405. }
  406. loading.CloseLoading();
  407. }
  408. catch (Exception ex2)
  409. {
  410. errorCode = "-1";
  411. errorMessage = "ReportFormd:" + ex2.Message;
  412. }
  413. errorCode = "-1";
  414. errorMessage = "ReportFormd:";
  415. return SMFormOutDataobj;
  416. }
  417. private void payONLINE(JObject InjObject)
  418. {
  419. //loading.lblStatusText("请稍等........");
  420. SafeUI(() => loading.lblStatusText("请稍等........"));
  421. try
  422. {
  423. string PayCode = ini.IniReadValue("SMPay", "PayCode");
  424. // 创建一个 JObject 对象
  425. JObject hisParamsobj = new JObject();
  426. // 创建一个 JArray 对象
  427. JArray paramsArray = new JArray();
  428. paramsArray.Add(InjObject);
  429. hisParamsobj["params"] = paramsArray;
  430. hisParamsobj["code"] = PayCode;
  431. hisParamsobj["session"] = inParamsobj["session"];
  432. //调用his进行数据Pos数据组织
  433. RestClient restClient = new RestClient();
  434. // 20261020:发起支付需等待病人输密码,必须用长超时档(默认90s,ini 可配)
  435. Task<string> task = restClient.HISHTTPServices(hisParamsobj.ToString(), "", "", "", RestClient.TimeoutPay); //调用HIS回调
  436. string hisResult = task.Result;
  437. JObject hisResultObject = JObject.Parse(hisResult);
  438. // 20261020:原代码直接 .ToString(),当 HIS 返回 IRIS 原生错误结构(无 errorCode 字段)
  439. // 会抛 NullReferenceException 并被外层吞成"对象引用未设置",真实错误信息全部丢失。
  440. // 这里改为带标记的安全读取。
  441. string code = GetStr(hisResultObject, "errorCode");
  442. string msg = GetStr(hisResultObject, "errorMessage");
  443. string callbackDataRaw = GetStr(hisResultObject, "callbackData");
  444. errorCode = code;
  445. errorMessage = msg;
  446. string callbackDatainfo = callbackDataRaw;
  447. if (errorCode == "")
  448. {
  449. // 没有 errorCode —— 原样把 HIS 的返回内容作为错误信息透出去
  450. errorCode = "-1";
  451. errorMessage = "HIS返回非预期结构: " + hisResult;
  452. WriteDiag("payONLINE", "HIS 响应缺少 errorCode 字段,原始返回: " + hisResult);
  453. }
  454. if (errorCode == "0")
  455. {
  456. ///支付成功
  457. result = JObject.Parse(GetStr(hisResultObject, "result"));
  458. }
  459. else if (errorCode == "USERPAYING")
  460. {
  461. if (callbackDatainfo == "")
  462. {
  463. errorCode = "-1";
  464. errorMessage = "USERPAYING 但未返回 callbackData,无法轮询";
  465. WriteDiag("payONLINE", "USERPAYING 缺少 callbackData,原始返回: " + hisResult);
  466. }
  467. else
  468. {
  469. //loading.lblStatusText("请告知病人手机输入支付密码........");
  470. SafeUI(() => loading.lblStatusText("请告知病人手机输入支付密码........"));
  471. //Thread.Sleep(3000);
  472. int countDownTime = int.Parse(ini.IniReadValue("Config", "waitTime"));
  473. int warningTime = int.Parse(ini.IniReadValue("Config", "warningTime"));
  474. for (int i = 0; i < countDownTime; i++)
  475. {
  476. //Thread.Sleep(1000);
  477. //loading.label2Text(countDownTime - i, warningTime);
  478. SafeUI(() => loading.label2Text(countDownTime - i, warningTime));
  479. JObject callbackDataobj = JObject.Parse(callbackDatainfo);
  480. // 查询/回写走短超时档,避免单次轮询吃掉整个时间预算
  481. Task<string> savetask = restClient.HISHTTPServices(callbackDataobj.ToString(), "", "", "", RestClient.TimeoutQuery); //调用HIS回调保存数据
  482. string hisSaveResult = savetask.Result;
  483. JObject hisSaveResultobj = JObject.Parse(hisSaveResult);
  484. errorCode = GetStr(hisSaveResultobj, "errorCode");
  485. errorMessage = GetStr(hisSaveResultobj, "errorMessage");
  486. if (errorCode == "")
  487. {
  488. errorCode = "USERPAYING"; // 轮询响应异常时保持轮询,避免误判失败
  489. WriteDiag("payONLINE", "轮询响应缺少 errorCode,原始返回: " + hisSaveResult);
  490. }
  491. if (errorCode != "USERPAYING")
  492. {
  493. break;
  494. }
  495. }
  496. if (errorCode == "USERPAYING")
  497. {
  498. errorCode = "-1";
  499. errorMessage = "支付超时!!!";
  500. }
  501. }
  502. }
  503. else
  504. {
  505. ///支付失败
  506. errorCode = code;
  507. errorMessage = msg;
  508. }
  509. }
  510. catch (Exception ex2)
  511. {
  512. errorCode = "-1";
  513. errorMessage = "ReportFormd:" + ex2.Message;
  514. //MessageBox.Show(errorMessage);
  515. }
  516. //loading.CloseLoading();
  517. if (loading != null && !loading.IsDisposed)
  518. {
  519. if (loading.InvokeRequired)
  520. loading.Invoke((MethodInvoker)delegate { loading.CloseLoading(); });
  521. else
  522. loading.CloseLoading();
  523. }
  524. }
  525. private JObject formSMFormd(SMForm formSM)
  526. {
  527. SMFormOutDataobj = new JObject();
  528. try
  529. {
  530. if (formSM.ShowDialog() == DialogResult.OK)
  531. {
  532. SMFormOutDataobj = formSM.OutjObject;
  533. }
  534. else
  535. {
  536. SMFormOutDataobj = formSM.OutjObject;
  537. }
  538. }
  539. catch (Exception ex2)
  540. {
  541. errorCode = "-1";
  542. errorMessage = "ReportFormd:" + ex2.Message;
  543. }
  544. return SMFormOutDataobj;
  545. }
  546. private void formPOSFormd(JObject InjObject)
  547. {
  548. try
  549. {
  550. string PayCode = ini.IniReadValue("DGPosPay", "PayCode");
  551. // 创建一个 JObject 对象
  552. JObject hisParamsobj = new JObject();
  553. // 创建一个 JArray 对象
  554. JArray paramsArray = new JArray();
  555. paramsArray.Add(InjObject);
  556. hisParamsobj["params"] = paramsArray;
  557. hisParamsobj["code"] = PayCode;
  558. hisParamsobj["session"] = inParamsobj["session"];
  559. //调用his进行数据Pos数据组织
  560. RestClient restClient = new RestClient();
  561. Task<string> task = restClient.HISHTTPServices(hisParamsobj.ToString(), "", "", "", RestClient.TimeoutQuery); //调用HIS回调
  562. string hisResult = task.Result;
  563. JObject hisResultObject = JObject.Parse(hisResult);
  564. // 20261020:同 payONLINE,改为安全取值,避免 HIS 返回非预期结构时空引用
  565. errorCode = GetStr(hisResultObject, "errorCode");
  566. errorMessage = GetStr(hisResultObject, "errorMessage");
  567. string callbackDatainfo = GetStr(hisResultObject, "callbackData");
  568. if (errorCode == "")
  569. {
  570. errorCode = "-1";
  571. errorMessage = "HIS返回非预期结构: " + hisResult;
  572. WriteDiag("formPOSFormd", "HIS 响应缺少 errorCode 字段,原始返回: " + hisResult);
  573. }
  574. if (errorCode == "0")
  575. {
  576. if (callbackDatainfo == "")
  577. {
  578. errorCode = "-1";
  579. errorMessage = "POS支付成功但未返回 callbackData,无法回写";
  580. WriteDiag("formPOSFormd", "缺少 callbackData,原始返回: " + hisResult);
  581. }
  582. else
  583. {
  584. //调用posdll
  585. DGPosPayClass dgPosPay = new DGPosPayClass();
  586. string dllResult = dgPosPay.DGPosPay(hisResult);
  587. JObject dllResultobj = JObject.Parse(dllResult);
  588. errorCode = GetStr(dllResultobj, "errorCode");
  589. errorMessage = GetStr(dllResultobj, "errorMessage");
  590. string SavePayCode = ini.IniReadValue("DGPosPay", "SavePayCode");
  591. JObject callbackDataobj = JObject.Parse(callbackDatainfo);
  592. callbackDataobj["code"] = SavePayCode;
  593. string paramsinfo = callbackDataobj["params"][0].ToString();
  594. JObject paramsobj = JObject.Parse(paramsinfo);
  595. paramsobj.Add("posData", dllResultobj);
  596. JArray paramsArray2 = new JArray();
  597. paramsArray2.Add(paramsobj);
  598. callbackDataobj["params"] = paramsArray2;
  599. Task<string> savetask = restClient.HISHTTPServices(callbackDataobj.ToString(), "", "", "", RestClient.TimeoutQuery); //调用HIS回调保存数据
  600. string hisSaveResult = savetask.Result;
  601. JObject hisSaveResultobj = JObject.Parse(hisSaveResult);
  602. errorCode = GetStr(hisSaveResultobj, "errorCode");
  603. errorMessage = GetStr(hisSaveResultobj, "errorMessage");
  604. string resultRaw = GetStr(hisSaveResultobj, "result");
  605. if (resultRaw != "") { result = JObject.Parse(resultRaw); }
  606. }
  607. }
  608. }
  609. catch (Exception ex2)
  610. {
  611. errorCode = "-1";
  612. errorMessage = "ReportFormd:" + ex2.Message;
  613. //MessageBox.Show(errorMessage);
  614. }
  615. //thread.Abort();
  616. }
  617. private JObject LoadingFormd()
  618. {
  619. try
  620. {
  621. loading.Show();
  622. }
  623. catch (Exception ex2)
  624. {
  625. loading = new Loading();
  626. loading.Show();
  627. }
  628. return SMFormOutDataobj;
  629. }
  630. }
  631. }