CHuiyuanShoukuanWnd.cpp 32 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355
  1. #include "../pch/pch.h"
  2. #include "CHuiyuanShoukuanWnd.h"
  3. #include "CMessageboxWnd.h"
  4. #include "../helper/CSpeech.h"
  5. #include "../helper/MD5.h"
  6. #define WM_TIMER_WND_CLOSE 200001
  7. void CHuiyuanShoukuanWnd::Init()
  8. {
  9. //::SetWindowPos(m_hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE);
  10. }
  11. void CHuiyuanShoukuanWnd::Notify(TNotifyUI& msg)
  12. {
  13. DuiLib::CDuiString senderName = msg.pSender->GetName();
  14. if (msg.sType == _T("click"))
  15. {
  16. if (msg.pSender->GetName() == _T("closebtn"))
  17. {
  18. StartClose();
  19. }
  20. else if (msg.pSender->GetName() == _T("shoukuanBtn"))
  21. {
  22. StartShoukuan();
  23. }
  24. else if (msg.pSender->GetName() == L"shoukuan_btn_saomazhifu")
  25. {
  26. CHorizontalLayoutUI* pFukuanmaLayout = static_cast<CHorizontalLayoutUI*>(m_pm.FindControl(_T("fukuan_input_fukuanma_layout")));
  27. pFukuanmaLayout->SetVisible(true);
  28. CHorizontalLayoutUI* pShoujihaoLayout = static_cast<CHorizontalLayoutUI*>(m_pm.FindControl(_T("fukuan_input_shoujihao_layout")));
  29. pShoujihaoLayout->SetVisible(false);
  30. CButtonUI* pFukuanmaBtn = static_cast<CButtonUI*>(m_pm.FindControl(_T("shoukuan_btn_saomazhifu")));
  31. pFukuanmaBtn->SetTextColor(0xFF43A947);
  32. CButtonUI* pShoujihaoBtn = static_cast<CButtonUI*>(m_pm.FindControl(_T("shoukuan_btn_shoujihao")));
  33. pShoujihaoBtn->SetTextColor(0xFF555555);
  34. CControlUI* pFukuanmaLine = static_cast<CControlUI*>(m_pm.FindControl(_T("shoukuan_btn_saomazhifu_line")));
  35. pFukuanmaLine->SetVisible(true);
  36. CControlUI* pShoujihaoLine = static_cast<CControlUI*>(m_pm.FindControl(_T("shoukuan_btn_shoujihao_line")));
  37. pShoujihaoLine->SetVisible(false);
  38. m_shoukuanModel = 1;
  39. }
  40. else if (msg.pSender->GetName() == L"shoukuan_btn_shoujihao")
  41. {
  42. CHorizontalLayoutUI* pFukuanmaLayout = static_cast<CHorizontalLayoutUI*>(m_pm.FindControl(_T("fukuan_input_fukuanma_layout")));
  43. pFukuanmaLayout->SetVisible(false);
  44. CHorizontalLayoutUI* pShoujihaoLayout = static_cast<CHorizontalLayoutUI*>(m_pm.FindControl(_T("fukuan_input_shoujihao_layout")));
  45. pShoujihaoLayout->SetVisible(true);
  46. CButtonUI* pFukuanmaBtn = static_cast<CButtonUI*>(m_pm.FindControl(_T("shoukuan_btn_saomazhifu")));
  47. pFukuanmaBtn->SetTextColor(0xFF555555);
  48. CButtonUI* pShoujihaoBtn = static_cast<CButtonUI*>(m_pm.FindControl(_T("shoukuan_btn_shoujihao")));
  49. pShoujihaoBtn->SetTextColor(0xFF43A947);
  50. CControlUI* pFukuanmaLine = static_cast<CControlUI*>(m_pm.FindControl(_T("shoukuan_btn_saomazhifu_line")));
  51. pFukuanmaLine->SetVisible(false);
  52. CControlUI* pShoujihaoLine = static_cast<CControlUI*>(m_pm.FindControl(_T("shoukuan_btn_shoujihao_line")));
  53. pShoujihaoLine->SetVisible(true);
  54. m_shoukuanModel = 2;
  55. m_pm.SetNextTabControl(false);
  56. CEditUI* pShoujihao = static_cast<CEditUI*>(m_pm.FindControl(_T("shoujihao_edit")));
  57. pShoujihao->SetFocus();
  58. }
  59. else if (senderName == L"jianpan_1")
  60. {
  61. CEditUI* curEdit;
  62. CEditUI* pShoujihao = static_cast<CEditUI*>(m_pm.FindControl(_T("shoujihao_edit")));
  63. CEditUI* pPassword = static_cast<CEditUI*>(m_pm.FindControl(_T("password_edit")));
  64. if (m_inputType == 1)
  65. {
  66. curEdit = pShoujihao;
  67. }
  68. else
  69. {
  70. curEdit = pPassword;
  71. }
  72. wstring wsReason = curEdit->GetText();
  73. wsReason += L"1";
  74. curEdit->SetText(wsReason.c_str());
  75. curEdit->SetFocus();
  76. }
  77. else if (senderName == L"jianpan_2")
  78. {
  79. CEditUI* curEdit;
  80. CEditUI* pShoujihao = static_cast<CEditUI*>(m_pm.FindControl(_T("shoujihao_edit")));
  81. CEditUI* pPassword = static_cast<CEditUI*>(m_pm.FindControl(_T("password_edit")));
  82. if (m_inputType == 1)
  83. {
  84. curEdit = pShoujihao;
  85. }
  86. else
  87. {
  88. curEdit = pPassword;
  89. }
  90. wstring wsReason = curEdit->GetText();
  91. wsReason += L"2";
  92. curEdit->SetText(wsReason.c_str());
  93. curEdit->SetFocus();
  94. }
  95. else if (senderName == L"jianpan_3")
  96. {
  97. CEditUI* curEdit;
  98. CEditUI* pShoujihao = static_cast<CEditUI*>(m_pm.FindControl(_T("shoujihao_edit")));
  99. CEditUI* pPassword = static_cast<CEditUI*>(m_pm.FindControl(_T("password_edit")));
  100. if (m_inputType == 1)
  101. {
  102. curEdit = pShoujihao;
  103. }
  104. else
  105. {
  106. curEdit = pPassword;
  107. }
  108. wstring wsReason = curEdit->GetText();
  109. wsReason += L"3";
  110. curEdit->SetText(wsReason.c_str());
  111. curEdit->SetFocus();
  112. }
  113. else if (senderName == L"jianpan_4")
  114. {
  115. CEditUI* curEdit;
  116. CEditUI* pShoujihao = static_cast<CEditUI*>(m_pm.FindControl(_T("shoujihao_edit")));
  117. CEditUI* pPassword = static_cast<CEditUI*>(m_pm.FindControl(_T("password_edit")));
  118. if (m_inputType == 1)
  119. {
  120. curEdit = pShoujihao;
  121. }
  122. else
  123. {
  124. curEdit = pPassword;
  125. }
  126. wstring wsReason = curEdit->GetText();
  127. wsReason += L"4";
  128. curEdit->SetText(wsReason.c_str());
  129. curEdit->SetFocus();
  130. }
  131. else if (senderName == L"jianpan_5")
  132. {
  133. CEditUI* curEdit;
  134. CEditUI* pShoujihao = static_cast<CEditUI*>(m_pm.FindControl(_T("shoujihao_edit")));
  135. CEditUI* pPassword = static_cast<CEditUI*>(m_pm.FindControl(_T("password_edit")));
  136. if (m_inputType == 1)
  137. {
  138. curEdit = pShoujihao;
  139. }
  140. else
  141. {
  142. curEdit = pPassword;
  143. }
  144. wstring wsReason = curEdit->GetText();
  145. wsReason += L"5";
  146. curEdit->SetText(wsReason.c_str());
  147. curEdit->SetFocus();
  148. }
  149. else if (senderName == L"jianpan_6")
  150. {
  151. CEditUI* curEdit;
  152. CEditUI* pShoujihao = static_cast<CEditUI*>(m_pm.FindControl(_T("shoujihao_edit")));
  153. CEditUI* pPassword = static_cast<CEditUI*>(m_pm.FindControl(_T("password_edit")));
  154. if (m_inputType == 1)
  155. {
  156. curEdit = pShoujihao;
  157. }
  158. else
  159. {
  160. curEdit = pPassword;
  161. }
  162. wstring wsReason = curEdit->GetText();
  163. wsReason += L"6";
  164. curEdit->SetText(wsReason.c_str());
  165. curEdit->SetFocus();
  166. }
  167. else if (senderName == L"jianpan_7")
  168. {
  169. CEditUI* curEdit;
  170. CEditUI* pShoujihao = static_cast<CEditUI*>(m_pm.FindControl(_T("shoujihao_edit")));
  171. CEditUI* pPassword = static_cast<CEditUI*>(m_pm.FindControl(_T("password_edit")));
  172. if (m_inputType == 1)
  173. {
  174. curEdit = pShoujihao;
  175. }
  176. else
  177. {
  178. curEdit = pPassword;
  179. }
  180. wstring wsReason = curEdit->GetText();
  181. wsReason += L"7";
  182. curEdit->SetText(wsReason.c_str());
  183. curEdit->SetFocus();
  184. }
  185. else if (senderName == L"jianpan_8")
  186. {
  187. CEditUI* curEdit;
  188. CEditUI* pShoujihao = static_cast<CEditUI*>(m_pm.FindControl(_T("shoujihao_edit")));
  189. CEditUI* pPassword = static_cast<CEditUI*>(m_pm.FindControl(_T("password_edit")));
  190. if (m_inputType == 1)
  191. {
  192. curEdit = pShoujihao;
  193. }
  194. else
  195. {
  196. curEdit = pPassword;
  197. }
  198. wstring wsReason = curEdit->GetText();
  199. wsReason += L"8";
  200. curEdit->SetText(wsReason.c_str());
  201. curEdit->SetFocus();
  202. }
  203. else if (senderName == L"jianpan_9")
  204. {
  205. CEditUI* curEdit;
  206. CEditUI* pShoujihao = static_cast<CEditUI*>(m_pm.FindControl(_T("shoujihao_edit")));
  207. CEditUI* pPassword = static_cast<CEditUI*>(m_pm.FindControl(_T("password_edit")));
  208. if (m_inputType == 1)
  209. {
  210. curEdit = pShoujihao;
  211. }
  212. else
  213. {
  214. curEdit = pPassword;
  215. }
  216. wstring wsReason = curEdit->GetText();
  217. wsReason += L"9";
  218. curEdit->SetText(wsReason.c_str());
  219. curEdit->SetFocus();
  220. }
  221. else if (senderName == L"jianpan_0")
  222. {
  223. CEditUI* curEdit;
  224. CEditUI* pShoujihao = static_cast<CEditUI*>(m_pm.FindControl(_T("shoujihao_edit")));
  225. CEditUI* pPassword = static_cast<CEditUI*>(m_pm.FindControl(_T("password_edit")));
  226. if (m_inputType == 1)
  227. {
  228. curEdit = pShoujihao;
  229. }
  230. else
  231. {
  232. curEdit = pPassword;
  233. }
  234. wstring wsReason = curEdit->GetText();
  235. wsReason += L"0";
  236. curEdit->SetText(wsReason.c_str());
  237. curEdit->SetFocus();
  238. }
  239. else if (senderName == L"jianpan_x")
  240. {
  241. CEditUI* curEdit;
  242. CEditUI* pShoujihao = static_cast<CEditUI*>(m_pm.FindControl(_T("shoujihao_edit")));
  243. CEditUI* pPassword = static_cast<CEditUI*>(m_pm.FindControl(_T("password_edit")));
  244. if (m_inputType == 1)
  245. {
  246. curEdit = pShoujihao;
  247. }
  248. else
  249. {
  250. curEdit = pPassword;
  251. }
  252. wstring wsReason = curEdit->GetText();
  253. wsReason = wsReason.substr(0, wsReason.length() - 1);
  254. curEdit->SetText(wsReason.c_str());
  255. curEdit->SetFocus();
  256. }
  257. else if (senderName == L"jianpan_qingkong")
  258. {
  259. CEditUI* curEdit;
  260. CEditUI* pShoujihao = static_cast<CEditUI*>(m_pm.FindControl(_T("shoujihao_edit")));
  261. CEditUI* pPassword = static_cast<CEditUI*>(m_pm.FindControl(_T("password_edit")));
  262. if (m_inputType == 1)
  263. {
  264. curEdit = pShoujihao;
  265. }
  266. else
  267. {
  268. curEdit = pPassword;
  269. }
  270. wstring wsReason = curEdit->GetText();
  271. wsReason.clear();
  272. curEdit->SetText(wsReason.c_str());
  273. curEdit->SetFocus();
  274. }
  275. }
  276. else if (msg.sType == _T("textchanged"))
  277. {
  278. if (senderName == L"shoujihao_edit")
  279. {
  280. //只能输入数字,其他的全部删除
  281. CEditUI* m_pEdit = static_cast<CEditUI*>(m_pm.FindControl(_T("shoujihao_edit")));
  282. if (!m_pEdit->GetText().IsEmpty())
  283. {
  284. wstring ws_Value = m_pEdit->GetText();
  285. string strValue = CLewaimaiString::UnicodeToUTF8(ws_Value);
  286. for (size_t nIndex = 0; nIndex < strValue.length(); nIndex++)
  287. {
  288. unsigned char tmp = strValue.at(nIndex);
  289. if (tmp > 57 || tmp < 48)
  290. {
  291. //ASCII码不是数字的都过滤掉
  292. strValue = strValue.substr(0, nIndex);
  293. m_pEdit->SetText(CLewaimaiString::UTF8ToUnicode(strValue).c_str());
  294. m_pEdit->SetSel(strValue.length(), strValue.length());//重设给光标设置位置
  295. break;
  296. }
  297. }
  298. }
  299. }
  300. if (senderName == L"password_edit")
  301. {
  302. //只能输入数字,其他的全部删除
  303. CEditUI* m_pEdit = static_cast<CEditUI*>(m_pm.FindControl(_T("password_edit")));
  304. if (!m_pEdit->GetText().IsEmpty())
  305. {
  306. wstring ws_Value = m_pEdit->GetText();
  307. string strValue = CLewaimaiString::UnicodeToUTF8(ws_Value);
  308. for (size_t nIndex = 0; nIndex < strValue.length(); nIndex++)
  309. {
  310. unsigned char tmp = strValue.at(nIndex);
  311. if (tmp > 57 || tmp < 48)
  312. {
  313. //ASCII码不是数字的都过滤掉
  314. strValue = strValue.substr(0, nIndex);
  315. m_pEdit->SetText(CLewaimaiString::UTF8ToUnicode(strValue).c_str());
  316. m_pEdit->SetSel(strValue.length(), strValue.length());//重设给光标设置位置
  317. break;
  318. }
  319. }
  320. }
  321. }
  322. }
  323. else if (msg.sType == _T("setfocus"))
  324. {
  325. if (senderName == L"shoujihao_edit")
  326. {
  327. m_inputType = 1;
  328. }
  329. else if (senderName == L"password_edit")
  330. {
  331. m_inputType = 2;
  332. }
  333. }
  334. }
  335. LRESULT CHuiyuanShoukuanWnd::OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
  336. {
  337. LONG styleValue = ::GetWindowLong(*this, GWL_STYLE);
  338. styleValue &= ~WS_CAPTION;
  339. ::SetWindowLong(*this, GWL_STYLE, styleValue | WS_CLIPSIBLINGS | WS_CLIPCHILDREN);
  340. // 把自己的窗口句柄与窗口绘制管理器挂接在一起
  341. m_pm.Init(m_hWnd);
  342. m_pm.AddPreMessageFilter(this);
  343. CDialogBuilder builder;
  344. CControlUI* pRoot = builder.Create(_T("huiyuan_shoukuan_wnd.xml"), (UINT)0, NULL, &m_pm);
  345. ASSERT(pRoot && "Failed to parse XML");
  346. // 把这些控件绘制到本窗口上
  347. m_pm.AttachDialog(pRoot);
  348. // 把自己加入到CPaintManagerUI的m_aNotifiers数组中,用于处理Notify函数
  349. m_pm.AddNotifier(this);
  350. Init();
  351. return 0;
  352. }
  353. LRESULT CHuiyuanShoukuanWnd::OnClose(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
  354. {
  355. //销毁定时器
  356. KillTimer(m_hWnd, WM_TIMER_WND_CLOSE);
  357. bHandled = FALSE;
  358. return 0;
  359. }
  360. /*
  361. *这个是窗口被销毁的时候调用的
  362. **/
  363. LRESULT CHuiyuanShoukuanWnd::OnDestroy(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
  364. {
  365. bHandled = FALSE;
  366. return 0;
  367. }
  368. LRESULT CHuiyuanShoukuanWnd::OnNcActivate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
  369. {
  370. if (::IsIconic(*this))
  371. {
  372. bHandled = FALSE;
  373. }
  374. return (wParam == 0) ? TRUE : FALSE;
  375. }
  376. LRESULT CHuiyuanShoukuanWnd::OnNcCalcSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
  377. {
  378. return 0;
  379. }
  380. LRESULT CHuiyuanShoukuanWnd::OnNcPaint(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
  381. {
  382. return 0;
  383. }
  384. LRESULT CHuiyuanShoukuanWnd::OnNcHitTest(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
  385. {
  386. POINT pt;
  387. pt.x = GET_X_LPARAM(lParam);
  388. pt.y = GET_Y_LPARAM(lParam);
  389. ::ScreenToClient(*this, &pt);
  390. RECT rcClient;
  391. ::GetClientRect(*this, &rcClient);
  392. RECT rcCaption = m_pm.GetCaptionRect();
  393. if (pt.x >= rcClient.left + rcCaption.left && pt.x < rcClient.right - rcCaption.right \
  394. && pt.y >= rcCaption.top && pt.y < rcCaption.bottom)
  395. {
  396. CControlUI* pControl = static_cast<CControlUI*>(m_pm.FindControl(pt));
  397. if (pControl && _tcscmp(pControl->GetClass(), DUI_CTR_BUTTON) != 0)
  398. {
  399. return HTCAPTION;
  400. }
  401. }
  402. return HTCLIENT;
  403. }
  404. LRESULT CHuiyuanShoukuanWnd::OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
  405. {
  406. SIZE szRoundCorner = m_pm.GetRoundCorner();
  407. if (!::IsIconic(*this) && (szRoundCorner.cx != 0 || szRoundCorner.cy != 0))
  408. {
  409. CDuiRect rcWnd;
  410. ::GetWindowRect(*this, &rcWnd);
  411. rcWnd.Offset(-rcWnd.left, -rcWnd.top);
  412. rcWnd.right++;
  413. rcWnd.bottom++;
  414. HRGN hRgn = ::CreateRoundRectRgn(rcWnd.left, rcWnd.top, rcWnd.right, rcWnd.bottom, szRoundCorner.cx, szRoundCorner.cy);
  415. ::SetWindowRgn(*this, hRgn, TRUE);
  416. ::DeleteObject(hRgn);
  417. }
  418. bHandled = FALSE;
  419. return 0;
  420. }
  421. LRESULT CHuiyuanShoukuanWnd::OnMouseMove(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
  422. {
  423. bHandled = TRUE;
  424. return 0;
  425. }
  426. LRESULT CHuiyuanShoukuanWnd::OnTimer(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
  427. {
  428. if (wParam != WM_TIMER_WND_CLOSE)
  429. {
  430. bHandled = FALSE;
  431. return 0;
  432. }
  433. if (m_shoukuan_status == 0 || m_shoukuan_status == 1)
  434. {
  435. }
  436. else if (m_shoukuan_status == 2)
  437. {
  438. }
  439. else if (m_shoukuan_status == 3)
  440. {
  441. m_timer_now--;
  442. if (m_timer_now > 0)
  443. {
  444. CLabelUI* attention = static_cast<CLabelUI*>(m_pm.FindControl(_T("shouyin_pay_success_attention")));
  445. std::wstring ws_attention = L"按任意键关闭窗口," + to_wstring(m_timer_now) + L" 秒后自动关闭";
  446. attention->SetText(ws_attention.c_str());
  447. }
  448. else
  449. {
  450. Close(IDOK);
  451. }
  452. }
  453. else if (m_shoukuan_status == 4)
  454. {
  455. m_timer_now--;
  456. if (m_timer_now > 0)
  457. {
  458. CLabelUI* pFailMessage = static_cast<CLabelUI*>(m_pm.FindControl(_T("shouyin_pay_fail_attention")));
  459. std::wstring ws_fail_message = L"失败信息:" + m_fail_message + L",按任意键关闭窗口,";
  460. std::wstring ws_attention = ws_fail_message + to_wstring(m_timer_now) + L" 秒后自动关闭";
  461. pFailMessage->SetText(ws_attention.c_str());
  462. }
  463. else
  464. {
  465. Close(IDCANCEL);
  466. }
  467. }
  468. bHandled = TRUE;
  469. return 0;
  470. }
  471. LRESULT CHuiyuanShoukuanWnd::HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam)
  472. {
  473. LRESULT lRes = 0;
  474. BOOL bHandled = TRUE;
  475. switch (uMsg)
  476. {
  477. case WM_CREATE:
  478. lRes = OnCreate(uMsg, wParam, lParam, bHandled);
  479. break;
  480. case WM_CLOSE:
  481. lRes = OnClose(uMsg, wParam, lParam, bHandled);
  482. break;
  483. case WM_DESTROY:
  484. lRes = OnDestroy(uMsg, wParam, lParam, bHandled);
  485. break;
  486. case WM_NCACTIVATE:
  487. lRes = OnNcActivate(uMsg, wParam, lParam, bHandled);
  488. break;
  489. case WM_NCCALCSIZE:
  490. lRes = OnNcCalcSize(uMsg, wParam, lParam, bHandled);
  491. break;
  492. case WM_NCPAINT:
  493. lRes = OnNcPaint(uMsg, wParam, lParam, bHandled);
  494. break;
  495. case WM_NCHITTEST:
  496. lRes = OnNcHitTest(uMsg, wParam, lParam, bHandled);
  497. break;
  498. case WM_SIZE:
  499. lRes = OnSize(uMsg, wParam, lParam, bHandled);
  500. break;
  501. case WM_MOUSEHOVER:
  502. lRes = OnMouseMove(uMsg, wParam, lParam, bHandled);
  503. break;
  504. case WM_SHOUKUAN_STATUS_NEEDPASSWORD:
  505. lRes = OnShoukuanNeedPassword(uMsg, wParam, lParam, bHandled);
  506. break;
  507. case WM_SHOUKUAN_STATUS_SUCCESS:
  508. lRes = OnShoukuanSuccess(uMsg, wParam, lParam, bHandled);
  509. break;
  510. case WM_SHOUKUAN_STATUS_FAIL:
  511. lRes = OnShoukuanFail(uMsg, wParam, lParam, bHandled);
  512. break;
  513. case WM_TIMER:
  514. lRes = OnTimer(uMsg, wParam, lParam, bHandled);
  515. break;
  516. default:
  517. bHandled = FALSE;
  518. }
  519. if (bHandled)
  520. {
  521. return lRes;
  522. }
  523. if (m_pm.MessageHandler(uMsg, wParam, lParam, lRes))
  524. {
  525. return lRes;
  526. }
  527. return CWindowWnd::HandleMessage(uMsg, wParam, lParam);
  528. }
  529. LRESULT CHuiyuanShoukuanWnd::MessageHandler(UINT uMsg, WPARAM wParam, LPARAM lParam, bool& bHandled)
  530. {
  531. if (uMsg == WM_KEYDOWN)
  532. {
  533. if (wParam == VK_RETURN)
  534. {
  535. if (m_shoukuan_status == 0)
  536. {
  537. if (m_shoukuanModel == 2)
  538. {
  539. StartShoukuan();
  540. }
  541. }
  542. else if (m_shoukuan_status == 1 || m_shoukuan_status == 2 || m_shoukuan_status == 5)
  543. {
  544. //正在支付的过程中,这个时候按Enter键,不做任何处理
  545. }
  546. else if (m_shoukuan_status == 3)
  547. {
  548. Close(IDOK);
  549. }
  550. else if (m_shoukuan_status == 4)
  551. {
  552. //Close(IDCANCEL);
  553. if (m_shoukuanModel == 2)
  554. {
  555. StartShoukuan();
  556. }
  557. }
  558. return true;
  559. }
  560. else if (wParam == VK_ESCAPE)
  561. {
  562. StartClose();
  563. return true;
  564. }
  565. if (m_shoukuan_status == 3)
  566. {
  567. Close(IDOK);
  568. return true;
  569. }
  570. else if (m_shoukuan_status == 4)
  571. {
  572. //Close(IDCANCEL);
  573. return true;
  574. }
  575. }
  576. return false;
  577. }
  578. void CHuiyuanShoukuanWnd::InitMoney(std::wstring value)
  579. {
  580. CLabelUI* pMoneyLabel = static_cast<CLabelUI*>(m_pm.FindControl(_T("shoukuan_money_show_money")));
  581. if (pMoneyLabel)
  582. {
  583. pMoneyLabel->SetText(value.c_str());
  584. }
  585. m_money = value;
  586. }
  587. void CHuiyuanShoukuanWnd::InitFukuanma(std::string fukuanma)
  588. {
  589. m_fukuanma = fukuanma;
  590. this->StartShoukuan();
  591. }
  592. void CHuiyuanShoukuanWnd::SetCommonParams(std::map<string, string> params)
  593. {
  594. m_commonParams = params;
  595. }
  596. LRESULT CHuiyuanShoukuanWnd::OnShoukuanNeedPassword(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
  597. {
  598. wstring path = CSystem::GetProgramDir() + L"\\music\\pay_password.wav";
  599. if (CSetting::GetInstance()->GetParam("setting_is_new_diannei_voice") == "1")
  600. {
  601. PlaySound(path.c_str(), NULL, SND_FILENAME | SND_ASYNC);
  602. }
  603. CLabelUI* pFukuanEdit = static_cast<CLabelUI*>(m_pm.FindControl(_T("shoukuan_paying_status")));
  604. pFukuanEdit->SetText(L"用户支付中,需要输入密码");
  605. //需要用户输入密码,开始查询状态
  606. std::thread(&CHuiyuanShoukuanWnd::HandleShoukuanPassword, this).detach();
  607. bHandled = TRUE;
  608. return 0;
  609. }
  610. LRESULT CHuiyuanShoukuanWnd::OnShoukuanSuccess(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
  611. {
  612. //播放收款成功的金额
  613. if (CSetting::GetInstance()->GetParam("setting_is_new_diannei_voice") == "1")
  614. {
  615. std::thread(&CHuiyuanShoukuanWnd::ReadShoukuanValue, this).detach();
  616. }
  617. Close(IDOK);
  618. bHandled = TRUE;
  619. return 0;
  620. /*
  621. CVerticalLayoutUI* paying_layout = static_cast<CVerticalLayoutUI*>(m_pm.FindControl(_T("shoukuan_paying_layout")));
  622. paying_layout->SetVisible(false);
  623. CVerticalLayoutUI* pay_success_layout = static_cast<CVerticalLayoutUI*>(m_pm.FindControl(_T("shoukuan_pay_success_layout")));
  624. pay_success_layout->SetVisible(true);
  625. CLabelUI* pMoneyPaySuccess = static_cast<CLabelUI*>(m_pm.FindControl(_T("shoukuan_pay_success_money")));
  626. std::wstring valueInfo = L"成功收款:¥" + m_money;
  627. pMoneyPaySuccess->SetText(valueInfo.c_str());
  628. CLabelUI* attention = static_cast<CLabelUI*>(m_pm.FindControl(_T("shouyin_pay_success_attention")));
  629. std::wstring ws_attention = L"按任意键关闭窗口," + to_wstring(m_timer_now) + L" 秒后自动关闭";
  630. attention->SetText(ws_attention.c_str());
  631. SetTimer(m_hWnd, WM_TIMER_WND_CLOSE, 1000, NULL);
  632. SetFocus(m_hWnd);
  633. bHandled = TRUE;
  634. return 0;
  635. */
  636. }
  637. LRESULT CHuiyuanShoukuanWnd::OnShoukuanFail(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
  638. {
  639. wstring path = CSystem::GetProgramDir() + L"\\music\\pay_fail.wav";
  640. if (CSetting::GetInstance()->GetParam("setting_is_new_diannei_voice") == "1")
  641. {
  642. PlaySound(path.c_str(), NULL, SND_FILENAME | SND_ASYNC);
  643. }
  644. CVerticalLayoutUI* paying_layout = static_cast<CVerticalLayoutUI*>(m_pm.FindControl(_T("shoukuan_paying_layout")));
  645. paying_layout->SetVisible(false);
  646. CVerticalLayoutUI* before_pay_layout = static_cast<CVerticalLayoutUI*>(m_pm.FindControl(_T("shoukuan_before_pay_layout")));
  647. before_pay_layout->SetVisible(true);
  648. CLabelUI* pLabel = static_cast<CLabelUI*>(m_pm.FindControl(_T("shoukuanresult")));
  649. pLabel->SetText((L"收款失败:" + m_fail_message).c_str());
  650. pLabel->SetVisible(true);
  651. SetFocus(m_hWnd);
  652. bHandled = TRUE;
  653. return 0;
  654. }
  655. void CHuiyuanShoukuanWnd::StartShoukuan()
  656. {
  657. CLabelUI* pLabel = static_cast<CLabelUI*>(m_pm.FindControl(_T("shoukuanresult")));
  658. //检查收款金额
  659. if (m_money == L"")
  660. {
  661. pLabel->SetText(L"收款金额不能为空,请重新输入!");
  662. pLabel->SetVisible(true);
  663. return;
  664. }
  665. if (m_money == L"0.00")
  666. {
  667. pLabel->SetText(L"收款金额不能为 0 元,请重新输入!");
  668. pLabel->SetVisible(true);
  669. return;
  670. }
  671. double money_value = atof(CLewaimaiString::UnicodeToUTF8(m_money).c_str());
  672. if (!money_value || money_value < 0.01)
  673. {
  674. pLabel->SetText(L"收款金额错误,请重新输入!");
  675. pLabel->SetVisible(true);
  676. return;
  677. }
  678. if (money_value > 50000)
  679. {
  680. pLabel->SetText(L"单笔收款金额不能大于5万,请重新输入!");
  681. pLabel->SetVisible(true);
  682. return;
  683. }
  684. //先判断收款码的格式是否正确
  685. CEditUI* pShoujihaoEdit = static_cast<CEditUI*>(m_pm.FindControl(_T("shoujihao_edit")));
  686. std::wstring ws_Shoujihao = pShoujihaoEdit->GetText();
  687. m_shoujihao = CLewaimaiString::UnicodeToUTF8(ws_Shoujihao);
  688. CEditUI* pPasswordEdit = static_cast<CEditUI*>(m_pm.FindControl(_T("password_edit")));
  689. std::wstring ws_Password = pPasswordEdit->GetText();
  690. m_password = CLewaimaiString::UnicodeToUTF8(ws_Password);
  691. if (m_shoukuanModel == 2)
  692. {
  693. if (ws_Shoujihao.length() == 0)
  694. {
  695. pLabel->SetText(L"手机号不能为空");
  696. pLabel->SetVisible(true);
  697. return;
  698. }
  699. if (ws_Password.length() == 0)
  700. {
  701. pLabel->SetText(L"密码不能为空");
  702. pLabel->SetVisible(true);
  703. return;
  704. }
  705. }
  706. //全部验证通过,就可以开始修改状态了
  707. m_shoukuan_status = 1;
  708. //不加这个的话,edit按回车之后样式有问题
  709. SetFocus(m_hWnd);
  710. CVerticalLayoutUI* before_pay_layout = static_cast<CVerticalLayoutUI*>(m_pm.FindControl(_T("shoukuan_before_pay_layout")));
  711. before_pay_layout->SetVisible(false);
  712. CVerticalLayoutUI* paying_layout = static_cast<CVerticalLayoutUI*>(m_pm.FindControl(_T("shoukuan_paying_layout")));
  713. paying_layout->SetVisible(true);
  714. CLabelUI* pMoneyPaying = static_cast<CLabelUI*>(m_pm.FindControl(_T("shoukuan_paying_money")));
  715. std::wstring valueInfo = L"付款金额:¥" + m_money;
  716. pMoneyPaying->SetText(valueInfo.c_str());
  717. //开启一个线程,开始处理登录
  718. std::thread(&CHuiyuanShoukuanWnd::HandleShoukuan, this).detach();
  719. }
  720. void CHuiyuanShoukuanWnd::StartClose()
  721. {
  722. if (m_shoukuan_status == 0)
  723. {
  724. //还没开始支付,直接退出
  725. Close(IDCANCEL);
  726. }
  727. else if (m_shoukuan_status == 1 || m_shoukuan_status == 5)
  728. {
  729. //不能做任何处理
  730. }
  731. else if (m_shoukuan_status == 2)
  732. {
  733. //查询密码的过程中,取消付款
  734. CancelShoukuanPassword();
  735. }
  736. else if (m_shoukuan_status == 3)
  737. {
  738. Sleep(100);
  739. Close(IDOK);
  740. }
  741. else if (m_shoukuan_status == 4)
  742. {
  743. Sleep(100);
  744. Close(IDCANCEL);
  745. }
  746. }
  747. void CHuiyuanShoukuanWnd::HandleShoukuan()
  748. {
  749. //生成随机的order_no
  750. m_commonParams["zhifu_type"] = to_string(4);
  751. m_commonParams["zhifu_code"] = "";
  752. if (m_shoukuanModel == 1)
  753. {
  754. std::map<string, string> param;
  755. param["weixin_password"] = m_fukuanma;
  756. //先查询会员信息
  757. std::string response;
  758. std::string url = "/member/membercheckbyqrcode";
  759. bool ret = CZhipuziHttpClient::GetInstance()->Request(url.c_str(), param, response);
  760. if (ret == false)
  761. {
  762. m_shoukuan_status = 4;
  763. m_fail_message = L"请求服务器失败,请检查网络设置!";
  764. SendMessage(WM_SHOUKUAN_STATUS_FAIL, 0, 0);
  765. return;
  766. }
  767. rapidjson::Document document;
  768. document.Parse(response.c_str());
  769. if (document.HasParseError())
  770. {
  771. LOG_INFO("parse response error!");
  772. m_shoukuan_status = 4;
  773. m_fail_message = L"服务器错误";
  774. SendMessage(WM_SHOUKUAN_STATUS_FAIL, 0, 0);
  775. return;
  776. }
  777. if (!document.HasMember("errcode") || !document.HasMember("errmsg"))
  778. {
  779. LOG_INFO("json error!");
  780. m_shoukuan_status = 4;
  781. m_fail_message = L"服务器错误";
  782. SendMessage(WM_SHOUKUAN_STATUS_FAIL, 0, 0);
  783. return;
  784. }
  785. rapidjson::Value& v_errcode = document["errcode"];
  786. int errcode = v_errcode.GetInt();
  787. if (errcode != 0)
  788. {
  789. LOG_INFO("response failed! message:" << document["errmsg"].GetString());
  790. m_shoukuan_status = 4;
  791. std::string errmsg = document["errmsg"].GetString();
  792. m_fail_message = CLewaimaiString::UTF8ToUnicode(errmsg);
  793. SendMessage(WM_SHOUKUAN_STATUS_FAIL, 0, 0);
  794. return;
  795. }
  796. if (!document.HasMember("data"))
  797. {
  798. LOG_INFO("json error!");
  799. m_shoukuan_status = 4;
  800. m_fail_message = L"服务器错误";
  801. SendMessage(WM_SHOUKUAN_STATUS_FAIL, 0, 0);
  802. return;
  803. }
  804. rapidjson::Value& rows = document["data"]["rows"];
  805. if (rows.Size() == 0)
  806. {
  807. //没找到会员
  808. m_shoukuan_status = 4;
  809. m_fail_message = L"未找到对应会员信息";
  810. SendMessage(WM_SHOUKUAN_STATUS_FAIL, 0, 0);
  811. return;
  812. }
  813. std::string member_id = rows[0]["id"].GetString();
  814. m_commonParams["member_id"] = member_id;
  815. }
  816. else if (m_shoukuanModel == 2)
  817. {
  818. m_commonParams["phone"] = m_shoujihao;
  819. m_commonParams["pay_password"] = md5(m_password);
  820. }
  821. std::string response;
  822. std::string url;
  823. if (m_nType == 1)
  824. {
  825. url = "/diancan/sendorder";
  826. }
  827. else if (m_nType == 2)
  828. {
  829. url = "/dinnercash/pay";
  830. }
  831. bool ret = CZhipuziHttpClient::GetInstance()->Request(url.c_str(), m_commonParams, response);
  832. if (ret == false)
  833. {
  834. m_shoukuan_status = 4;
  835. m_fail_message = L"请求服务器失败,请检查网络设置!";
  836. SendMessage(WM_SHOUKUAN_STATUS_FAIL, 0, 0);
  837. return;
  838. }
  839. rapidjson::Document document;
  840. document.Parse(response.c_str());
  841. if (document.HasParseError())
  842. {
  843. LOG_INFO("parse response error!");
  844. m_shoukuan_status = 4;
  845. m_fail_message = L"服务器错误";
  846. SendMessage(WM_SHOUKUAN_STATUS_FAIL, 0, 0);
  847. return;
  848. }
  849. if (!document.HasMember("errcode") || !document.HasMember("errmsg"))
  850. {
  851. LOG_INFO("json error!");
  852. m_shoukuan_status = 4;
  853. m_fail_message = L"服务器错误";
  854. SendMessage(WM_SHOUKUAN_STATUS_FAIL, 0, 0);
  855. return;
  856. }
  857. rapidjson::Value& v_errcode = document["errcode"];
  858. int errcode = v_errcode.GetInt();
  859. if (errcode != 0)
  860. {
  861. LOG_INFO("response failed! message:" << document["errmsg"].GetString());
  862. m_shoukuan_status = 4;
  863. std::string errmsg = document["errmsg"].GetString();
  864. m_fail_message = CLewaimaiString::UTF8ToUnicode(errmsg);
  865. SendMessage(WM_SHOUKUAN_STATUS_FAIL, 0, 0);
  866. return;
  867. }
  868. if (!document.HasMember("data"))
  869. {
  870. LOG_INFO("json error!");
  871. m_shoukuan_status = 4;
  872. m_fail_message = L"服务器错误";
  873. SendMessage(WM_SHOUKUAN_STATUS_FAIL, 0, 0);
  874. return;
  875. }
  876. rapidjson::Value& data = document["data"];
  877. rapidjson::Value& status = data["status"];
  878. std::string s_status = status.GetString();
  879. if (s_status == "success")
  880. {
  881. //支付成功
  882. m_shoukuan_status = 3;
  883. Value& stock = data["stock"];
  884. m_kucun_string = CLewaimaiJson::JsonToString(stock);
  885. m_show_trade_no = data["show_trade_no"].GetString();
  886. if (m_nType == 1)
  887. {
  888. //快餐才有取餐号
  889. m_take_food_code = data["take_food_code"].GetString();
  890. }
  891. m_balance = CLewaimaiString::DoubleToString(data["balance"].GetFloat(), 2);
  892. m_member_number = data["member_number"].GetString();
  893. SendMessage(WM_SHOUKUAN_STATUS_SUCCESS, 0, 0);
  894. }
  895. else if (s_status == "fail")
  896. {
  897. //支付失败
  898. m_shoukuan_status = 4;
  899. m_fail_message = CLewaimaiString::UTF8ToUnicode(data["message"].GetString());
  900. SendMessage(WM_SHOUKUAN_STATUS_FAIL, 0, 0);
  901. }
  902. else if (s_status == "password")
  903. {
  904. m_shoukuan_status = 2;
  905. //需要查询支付状态
  906. SendMessage(WM_SHOUKUAN_STATUS_NEEDPASSWORD, 0, 0);
  907. }
  908. else
  909. {
  910. m_shoukuan_status = 4;
  911. m_fail_message = L"服务器错误";
  912. SendMessage(WM_SHOUKUAN_STATUS_FAIL, 0, 0);
  913. }
  914. }
  915. void CHuiyuanShoukuanWnd::HandleShoukuanPassword()
  916. {
  917. std::map<string, string> params;
  918. params["trade_no"] = "";
  919. while (m_shoukuan_status == 2)
  920. {
  921. std::string response;
  922. std::string url;
  923. if (m_nType == 1)
  924. {
  925. url = "/diancan/queryorderstatus";
  926. }
  927. else if (m_nType == 2)
  928. {
  929. url = "/dinnercash/queryorderstatus";
  930. }
  931. bool ret = CZhipuziHttpClient::GetInstance()->Request(url.c_str(), params, response);
  932. if (ret == false)
  933. {
  934. m_shoukuan_status = 4;
  935. m_fail_message = L"请求服务器失败,请检查网络设置!";
  936. SendMessage(WM_SHOUKUAN_STATUS_FAIL, 0, 0);
  937. return;
  938. }
  939. rapidjson::Document document;
  940. document.Parse(response.c_str());
  941. if (document.HasParseError())
  942. {
  943. LOG_INFO("parse response error!");
  944. m_shoukuan_status = 4;
  945. m_fail_message = L"服务器错误";
  946. SendMessage(WM_SHOUKUAN_STATUS_FAIL, 0, 0);
  947. return;
  948. }
  949. if (!document.HasMember("errcode") || !document.HasMember("errmsg") || !document.HasMember("data"))
  950. {
  951. LOG_INFO("json error!");
  952. m_shoukuan_status = 4;
  953. m_fail_message = L"服务器错误";
  954. SendMessage(WM_SHOUKUAN_STATUS_FAIL, 0, 0);
  955. return;
  956. }
  957. rapidjson::Value& v_errcode = document["errcode"];
  958. int errcode = v_errcode.GetInt();
  959. if (errcode != 0)
  960. {
  961. LOG_INFO("response failed! message:" << document["errmsg"].GetString());
  962. m_shoukuan_status = 4;
  963. m_fail_message = L"服务器错误";
  964. SendMessage(WM_SHOUKUAN_STATUS_FAIL, 0, 0);
  965. return;
  966. }
  967. rapidjson::Value& data = document["data"];
  968. rapidjson::Value& status = data["status"];
  969. std::string s_status = status.GetString();
  970. if (s_status == "success")
  971. {
  972. //支付成功
  973. m_shoukuan_status = 3;
  974. Value& stock = data["stock"];
  975. m_kucun_string = CLewaimaiJson::JsonToString(stock);
  976. m_show_trade_no = data["show_trade_no"].GetString();
  977. if (m_nType == 1)
  978. {
  979. //快餐才有取餐号
  980. m_take_food_code = data["take_food_code"].GetString();
  981. }
  982. SendMessage(WM_SHOUKUAN_STATUS_SUCCESS, 0, 0);
  983. break;
  984. }
  985. else if (s_status == "closed")
  986. {
  987. //表示顾客那边出问题,已经失败了
  988. m_shoukuan_status = 4;
  989. m_fail_message = L"顾客取消支付,请重新扫码收款";
  990. SendMessage(WM_SHOUKUAN_STATUS_FAIL, 0, 0);
  991. break;
  992. }
  993. else if (s_status == "fail")
  994. {
  995. //这个只是表示状态未知
  996. Sleep(1000);
  997. }
  998. else
  999. {
  1000. m_shoukuan_status = 4;
  1001. m_fail_message = L"服务器错误";
  1002. SendMessage(WM_SHOUKUAN_STATUS_FAIL, 0, 0);
  1003. break;
  1004. }
  1005. }
  1006. }
  1007. void CHuiyuanShoukuanWnd::CancelShoukuanPassword()
  1008. {
  1009. m_shoukuan_status = 5;
  1010. std::thread(&CHuiyuanShoukuanWnd::HandleCancelShoukuan, this).detach();
  1011. }
  1012. void CHuiyuanShoukuanWnd::HandleCancelShoukuan()
  1013. {
  1014. std::map<string, string> params;
  1015. params["trade_no"] = "";
  1016. std::string response;
  1017. std::string url;
  1018. if (m_nType == 1)
  1019. {
  1020. url = "/diancan/closeorder";
  1021. }
  1022. else if (m_nType == 2)
  1023. {
  1024. url = "/dinnercash/closeorder";
  1025. }
  1026. bool ret = CZhipuziHttpClient::GetInstance()->Request(url.c_str(), params, response);
  1027. if (ret == false)
  1028. {
  1029. m_shoukuan_status = 4;
  1030. m_fail_message = L"请求服务器失败,请检查网络设置!";
  1031. SendMessage(WM_SHOUKUAN_STATUS_FAIL, 0, 0);
  1032. return;
  1033. }
  1034. rapidjson::Document document;
  1035. document.Parse(response.c_str());
  1036. if (document.HasParseError())
  1037. {
  1038. LOG_INFO("parse response error!");
  1039. m_shoukuan_status = 4;
  1040. m_fail_message = L"服务器错误";
  1041. SendMessage(WM_SHOUKUAN_STATUS_FAIL, 0, 0);
  1042. return;
  1043. }
  1044. if (!document.HasMember("errcode") || !document.HasMember("errmsg") || !document.HasMember("data"))
  1045. {
  1046. LOG_INFO("json error!");
  1047. m_shoukuan_status = 4;
  1048. m_fail_message = L"服务器错误";
  1049. SendMessage(WM_SHOUKUAN_STATUS_FAIL, 0, 0);
  1050. return;
  1051. }
  1052. rapidjson::Value& v_errcode = document["errcode"];
  1053. int errcode = v_errcode.GetInt();
  1054. if (errcode != 0)
  1055. {
  1056. LOG_INFO("response failed! message:" << document["errmsg"].GetString());
  1057. m_shoukuan_status = 4;
  1058. m_fail_message = L"服务器错误";
  1059. SendMessage(WM_SHOUKUAN_STATUS_FAIL, 0, 0);
  1060. return;
  1061. }
  1062. rapidjson::Value& data = document["data"];
  1063. rapidjson::Value& status = data["status"];
  1064. std::string s_status = status.GetString();
  1065. if (s_status == "success")
  1066. {
  1067. //取消成功,订单变为失败状态
  1068. m_shoukuan_status = 4;
  1069. m_fail_message = L"商家取消收款";
  1070. SendMessage(WM_SHOUKUAN_STATUS_FAIL, 0, 0);
  1071. }
  1072. m_shoukuan_status = 4;
  1073. m_fail_message = L"服务器错误";
  1074. SendMessage(WM_SHOUKUAN_STATUS_FAIL, 0, 0);
  1075. }
  1076. void CHuiyuanShoukuanWnd::ReadShoukuanValue()
  1077. {
  1078. CSpeech::SpeakNum(1, CLewaimaiString::UnicodeToUTF8(m_money));
  1079. }
  1080. //处理键盘捕捉结果
  1081. void CHuiyuanShoukuanWnd::HandleTextCapture(std::string content)
  1082. {
  1083. if (m_shoukuanModel == 1)
  1084. {
  1085. m_fukuanma = content;
  1086. StartShoukuan();
  1087. }
  1088. }