CZhipuziHttpClient.cpp 6.8 KB

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