CZhipuziHttpClient.cpp 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237
  1. #include "../pch/pch.h"
  2. #include "CZhipuziHttpClient.h"
  3. #include "../helper/MD5.h"
  4. CZhipuziHttpClient CZhipuziHttpClient::m_client;
  5. CZhipuziHttpClient::CZhipuziHttpClient()
  6. {
  7. m_username = CSetting::getUsername();
  8. m_password = CSetting::getPassword();
  9. }
  10. CZhipuziHttpClient::~CZhipuziHttpClient()
  11. {
  12. }
  13. void CZhipuziHttpClient::Init(std::string username, std::string password)
  14. {
  15. m_client.m_username = username;
  16. m_client.m_password = password;
  17. }
  18. bool CZhipuziHttpClient::Login(std::string& errmsg)
  19. {
  20. std::map<string, string> params;
  21. std::string response;
  22. bool ret = m_client.RequestPingtai("/login/userlogin", params, response);
  23. if(!ret)
  24. {
  25. //网络请求出错
  26. LOG_INFO("network failed!");
  27. errmsg = "network failed!";
  28. return false;
  29. }
  30. LOG_INFO("response:" << response.c_str());
  31. rapidjson::Document document;
  32. document.Parse(response.c_str());
  33. if(!document.IsObject())
  34. {
  35. LOG_INFO("message 非法!");
  36. errmsg = "message 非法!";
  37. return false;
  38. }
  39. if(document.HasMember("errcode"))
  40. {
  41. rapidjson::Value& v_errcode = document["errcode"];
  42. int errcode = v_errcode.GetInt();
  43. if(errcode == -1)
  44. {
  45. LOG_INFO("login failed! message:" << document["errmsg"].GetString());
  46. errmsg = std::string(document["errmsg"].GetString());
  47. return false;
  48. }
  49. }
  50. else if(document.HasMember("error_code"))
  51. {
  52. rapidjson::Value& v_errcode = document["error_code"];
  53. int errcode = v_errcode.GetInt();
  54. if(errcode < 0)
  55. {
  56. LOG_INFO("login failed! message:" << document["error_msg"].GetString());
  57. errmsg = std::string(document["error_msg"].GetString());
  58. return false;
  59. }
  60. }
  61. rapidjson::Value& v_data = document["data"];
  62. rapidjson::Value& v_version_type = v_data["version_type"];
  63. m_client.m_version_type = v_version_type.GetString();
  64. if (m_client.m_version_type == "1")
  65. {
  66. m_client.m_yewu_ur = "https://cyapi.zhipuzi.com/pos";
  67. }
  68. else
  69. {
  70. m_client.m_yewu_ur = "https://lsapi.zhipuzi.com/pos";
  71. }
  72. rapidjson::Value& v_lwm_sess_token = v_data["lwm_sess_token"];
  73. m_client.lwm_sess_token = v_lwm_sess_token.GetString();
  74. LOG_INFO("login success!");
  75. return true;
  76. }
  77. bool CZhipuziHttpClient::Request(std::string url, std::map<string, string> params, std::string& response)
  78. {
  79. std::string timestamp = to_string(time(NULL));
  80. std::string nonce = "123456";
  81. //先添加默认参数,用于计算签名
  82. params["username"] = m_client.m_username;
  83. params["nonce"] = nonce;
  84. params["timestamp"] = timestamp;
  85. params["url"] = m_client.m_yewu_ur + url;
  86. //计算签名
  87. std::string postString;
  88. for(std::map<string, string>::iterator it = params.begin(); it != params.end();)
  89. {
  90. postString += it->first + "=" + it->second;
  91. it++;
  92. if(it != params.end())
  93. {
  94. postString += "&";
  95. }
  96. }
  97. LOG_INFO("postString:" << postString.c_str());
  98. //用于计算签名的临时变量
  99. std::string password = md5(m_client.m_password);
  100. transform(password.begin(), password.end(), password.begin(), ::toupper);
  101. string tmp = postString + password;
  102. std::string sign = md5(tmp);
  103. transform(sign.begin(), sign.end(), sign.begin(), ::toupper);
  104. LOG_INFO("sign:" << sign.c_str());
  105. //加上签名,去掉url,计算post
  106. params["sign"] = sign;
  107. params.erase("url");
  108. //未签名之前,不能进行urlencode,签名完成之后可以(params的value必须为utf8格式)
  109. postString = "";
  110. for(std::map<string, string>::iterator it = params.begin(); it != params.end();)
  111. {
  112. postString += it->first + "=" + CLewaimaiString::UrlEncode(it->second);
  113. it++;
  114. if(it != params.end())
  115. {
  116. postString += "&";
  117. }
  118. }
  119. LOG_INFO("postString:" << postString.c_str());
  120. CHttpClient m_httpClient;
  121. int ret = m_httpClient.Posts(m_client.m_yewu_ur + url, postString, response, NULL);
  122. LOG_INFO("response:" << response.c_str());
  123. if(ret == 0)
  124. {
  125. //ret为0表示没有出错
  126. return true;
  127. }
  128. return false;
  129. }
  130. bool CZhipuziHttpClient::RequestPingtai(std::string url, std::map<string, string> params, std::string& response)
  131. {
  132. std::string timestamp = to_string(time(NULL));
  133. std::string nonce = "123456";
  134. //先添加默认参数,用于计算签名
  135. params["username"] = m_client.m_username;
  136. params["nonce"] = nonce;
  137. params["timestamp"] = timestamp;
  138. params["url"] = m_client.m_pingtai_url + url;
  139. //计算签名
  140. std::string postString;
  141. for (std::map<string, string>::iterator it = params.begin(); it != params.end();)
  142. {
  143. postString += it->first + "=" + it->second;
  144. it++;
  145. if (it != params.end())
  146. {
  147. postString += "&";
  148. }
  149. }
  150. LOG_INFO("postString:" << postString.c_str());
  151. //用于计算签名的临时变量
  152. std::string password = md5(m_client.m_password);
  153. transform(password.begin(), password.end(), password.begin(), ::toupper);
  154. string tmp = postString + password;
  155. std::string sign = md5(tmp);
  156. transform(sign.begin(), sign.end(), sign.begin(), ::toupper);
  157. LOG_INFO("sign:" << sign.c_str());
  158. //加上签名,去掉url,计算post
  159. params["sign"] = sign;
  160. params.erase("url");
  161. //未签名之前,不能进行urlencode,签名完成之后可以(params的value必须为utf8格式)
  162. postString = "";
  163. for (std::map<string, string>::iterator it = params.begin(); it != params.end();)
  164. {
  165. postString += it->first + "=" + CLewaimaiString::UrlEncode(it->second);
  166. it++;
  167. if (it != params.end())
  168. {
  169. postString += "&";
  170. }
  171. }
  172. LOG_INFO("postString:" << postString.c_str());
  173. CHttpClient m_httpClient;
  174. int ret = m_httpClient.Posts(m_client.m_pingtai_url + url, postString, response, NULL);
  175. LOG_INFO("response:" << response.c_str());
  176. if (ret == 0)
  177. {
  178. //ret为0表示没有出错
  179. return true;
  180. }
  181. return false;
  182. }