CZhipuziHttpClient.cpp 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446
  1. #include "../pch/pch.h"
  2. #include "CZhipuziHttpClient.h"
  3. #include "../helper/MD5.h"
  4. #include <curl/curl.h>
  5. CZhipuziHttpClient::CZhipuziHttpClient()
  6. {
  7. //初始化curl
  8. curl_global_init(CURL_GLOBAL_ALL);
  9. //初始化htttp代理相关参数
  10. std::string http_is_proxy = CSetting::GetParam("http_is_proxy");
  11. if (http_is_proxy == "1")
  12. {
  13. m_is_http_proxy = true;
  14. }
  15. else
  16. {
  17. m_is_http_proxy = false;
  18. }
  19. m_http_proxy_ip = CSetting::GetParam("http_proxy_ip");
  20. m_http_proxy_port = CSetting::GetParam("http_proxy_port");
  21. if (m_env == DEV)
  22. {
  23. m_pingtai_url = "https://pf-api-dev3.zhipuzi.com/seller";
  24. }
  25. else if (m_env == TEST)
  26. {
  27. m_pingtai_url = "https://pf-api-test.zhipuzi.com/seller";
  28. }
  29. else if (m_env == RELEASE)
  30. {
  31. m_pingtai_url = "https://pf-api.zhipuzi.com/seller";
  32. }
  33. }
  34. /*
  35. *修改了htttp代理设置之后,这里修改状态
  36. **/
  37. void CZhipuziHttpClient::UpdateProxy()
  38. {
  39. std::string http_is_proxy = CSetting::GetParam("http_is_proxy");
  40. if (http_is_proxy == "1")
  41. {
  42. m_client.m_is_http_proxy = true;
  43. }
  44. else
  45. {
  46. m_client.m_is_http_proxy = false;
  47. }
  48. m_client.m_http_proxy_ip = CSetting::GetParam("http_proxy_ip");
  49. m_client.m_http_proxy_port = CSetting::GetParam("http_proxy_port");
  50. }
  51. CZhipuziHttpClient::~CZhipuziHttpClient()
  52. {
  53. }
  54. void CZhipuziHttpClient::Init(std::string username, std::string password)
  55. {
  56. m_client.m_username = username;
  57. m_client.m_password = password;
  58. }
  59. bool CZhipuziHttpClient::Login(std::string& errmsg)
  60. {
  61. std::map<string, string> params;
  62. std::string response;
  63. bool ret = m_client.RequestPingtaiNew("/login/login", params, response);
  64. if(!ret)
  65. {
  66. //网络请求出错
  67. LOG_INFO("network failed!");
  68. errmsg = CLewaimaiString::UnicodeToUTF8(L"请求服务器失败,请检查网络设置!");;
  69. return false;
  70. }
  71. LOG_INFO("response:" << response.c_str());
  72. rapidjson::Document document;
  73. document.Parse(response.c_str());
  74. if(!document.IsObject())
  75. {
  76. LOG_INFO("message 非法!");
  77. errmsg = CLewaimaiString::UnicodeToUTF8(L"服务器错误");
  78. return false;
  79. }
  80. if(document.HasMember("errcode"))
  81. {
  82. rapidjson::Value& v_errcode = document["errcode"];
  83. int errcode = v_errcode.GetInt();
  84. if(errcode != 0)
  85. {
  86. LOG_INFO("login failed! message:" << document["errmsg"].GetString());
  87. errmsg = std::string(document["errmsg"].GetString());
  88. if (errcode == 10003)
  89. {
  90. errmsg = CLewaimaiString::UnicodeToUTF8(L"密码错误");
  91. }
  92. return false;
  93. }
  94. }
  95. else if(document.HasMember("error_code"))
  96. {
  97. rapidjson::Value& v_errcode = document["error_code"];
  98. int errcode = v_errcode.GetInt();
  99. if(errcode != 0)
  100. {
  101. LOG_INFO("login failed! message:" << document["error_msg"].GetString());
  102. errmsg = std::string(document["error_msg"].GetString());
  103. if (errcode == 10003)
  104. {
  105. errmsg = CLewaimaiString::UnicodeToUTF8(L"密码错误");
  106. }
  107. return false;
  108. }
  109. }
  110. rapidjson::Value& v_data = document["data"];
  111. rapidjson::Value& v_version_type = v_data["version_type"];
  112. m_client.m_version_type = v_version_type.GetString();
  113. if (m_client.m_version_type == "1")
  114. {
  115. if (m_client.m_env == RELEASE)
  116. {
  117. m_client.m_yewu_url = "https://cyapi.zhipuzi.com/seller";
  118. }
  119. else if (m_client.m_env == TEST)
  120. {
  121. m_client.m_yewu_url = "https://cyapi-test.zhipuzi.com/seller";
  122. }
  123. else if (m_client.m_env == DEV)
  124. {
  125. m_client.m_yewu_url = "https://cyapi-dev3.zhipuzi.com/seller";
  126. }
  127. }
  128. else
  129. {
  130. m_client.m_yewu_url = "https://lsapi.zhipuzi.com/seller";
  131. }
  132. rapidjson::Value& v_lwm_sess_token = v_data["lwm_sess_token"];
  133. m_client.lwm_sess_token = v_lwm_sess_token.GetString();
  134. LOG_INFO("login success!");
  135. return true;
  136. }
  137. bool CZhipuziHttpClient::Request(std::string url, std::map<string, string> params, std::string& response)
  138. {
  139. std::string timestamp = to_string(time(NULL));
  140. std::string nonce = "123456";
  141. //先添加默认参数,用于计算签名
  142. params["username"] = m_client.m_username;
  143. params["nonce"] = nonce;
  144. params["timestamp"] = timestamp;
  145. params["url"] = m_client.m_yewu_url + url;
  146. //计算签名
  147. std::string postString;
  148. for(std::map<string, string>::iterator it = params.begin(); it != params.end();)
  149. {
  150. postString += it->first + "=" + it->second;
  151. it++;
  152. if(it != params.end())
  153. {
  154. postString += "&";
  155. }
  156. }
  157. LOG_INFO("postString:" << postString.c_str());
  158. //用于计算签名的临时变量
  159. std::string password = md5(m_client.m_password);
  160. transform(password.begin(), password.end(), password.begin(), ::toupper);
  161. string tmp = postString + password;
  162. std::string sign = md5(tmp);
  163. transform(sign.begin(), sign.end(), sign.begin(), ::toupper);
  164. LOG_INFO("sign:" << sign.c_str());
  165. //加上签名,去掉url,计算post
  166. params["sign"] = sign;
  167. params.erase("url");
  168. //未签名之前,不能进行urlencode,签名完成之后可以(params的value必须为utf8格式)
  169. postString = "";
  170. for(std::map<string, string>::iterator it = params.begin(); it != params.end();)
  171. {
  172. postString += it->first + "=" + CLewaimaiString::UrlEncode(it->second);
  173. it++;
  174. if(it != params.end())
  175. {
  176. postString += "&";
  177. }
  178. }
  179. LOG_INFO("postString:" << postString.c_str());
  180. CHttpClient m_httpClient;
  181. int ret = m_httpClient.Posts(m_client.m_yewu_url + url, postString, response, NULL, m_client.m_is_http_proxy, m_client.m_http_proxy_ip, m_client.m_http_proxy_port);
  182. LOG_INFO("response:" << response.c_str());
  183. if(ret == 0)
  184. {
  185. //ret为0表示没有出错
  186. return true;
  187. }
  188. return false;
  189. }
  190. bool CZhipuziHttpClient::RequestNew(std::string url, std::map<string, string> params, std::string& response)
  191. {
  192. std::string timestamp = to_string(time(NULL));
  193. std::string nonce = "123456";
  194. std::string lwm_appid = "kJnkkHODnoloay197k97G129J";
  195. std::string open_secret = "kMDNjjid91ydo#!9DH1";
  196. //先添加默认参数,用于计算签名
  197. params["username"] = CLewaimaiString::UrlEncode(m_client.m_username);
  198. params["password"] = md5(m_client.m_password);
  199. params["lwm_appid"] = lwm_appid;
  200. params["nonce"] = nonce;
  201. params["timestamp"] = timestamp;
  202. //计算签名
  203. std::string postString;
  204. for (std::map<string, string>::iterator it = params.begin(); it != params.end(); )
  205. {
  206. postString += it->first + "=" + it->second;
  207. it++;
  208. if (it != params.end())
  209. {
  210. postString += "&";
  211. }
  212. }
  213. LOG_INFO("postString:" << postString.c_str());
  214. //用于计算签名的临时变量
  215. string tmp = md5(postString);
  216. tmp += open_secret;
  217. std::string sign = md5(tmp);
  218. transform(sign.begin(), sign.end(), sign.begin(), ::toupper);
  219. LOG_INFO("sign:" << sign.c_str());
  220. //加上签名,去掉url,计算post
  221. params["sign"] = sign;
  222. postString = "";
  223. for (std::map<string, string>::iterator it = params.begin(); it != params.end(); )
  224. {
  225. postString += it->first + "=" + it->second;
  226. it++;
  227. if (it != params.end())
  228. {
  229. postString += "&";
  230. }
  231. }
  232. LOG_INFO("postString:" << postString.c_str());
  233. CHttpClient m_httpClient;
  234. int ret = m_httpClient.Posts(m_client.m_yewu_url + url, postString, response, NULL, m_client.m_is_http_proxy, m_client.m_http_proxy_ip, m_client.m_http_proxy_port);
  235. LOG_INFO("response:" << response.c_str());
  236. if (ret == 0)
  237. {
  238. //ret为0表示没有出错
  239. return true;
  240. }
  241. return false;
  242. }
  243. bool CZhipuziHttpClient::RequestPingtai(std::string url, std::map<string, string> params, std::string& response)
  244. {
  245. std::string timestamp = to_string(time(NULL));
  246. std::string nonce = "123456";
  247. //先添加默认参数,用于计算签名
  248. params["username"] = m_client.m_username;
  249. params["nonce"] = nonce;
  250. params["timestamp"] = timestamp;
  251. params["url"] = m_client.m_pingtai_url + url;
  252. //计算签名
  253. std::string postString;
  254. for (std::map<string, string>::iterator it = params.begin(); it != params.end();)
  255. {
  256. postString += it->first + "=" + it->second;
  257. it++;
  258. if (it != params.end())
  259. {
  260. postString += "&";
  261. }
  262. }
  263. LOG_INFO("postString:" << postString.c_str());
  264. //用于计算签名的临时变量
  265. std::string password = md5(m_client.m_password);
  266. transform(password.begin(), password.end(), password.begin(), ::toupper);
  267. string tmp = postString + password;
  268. std::string sign = md5(tmp);
  269. transform(sign.begin(), sign.end(), sign.begin(), ::toupper);
  270. LOG_INFO("sign:" << sign.c_str());
  271. //加上签名,去掉url,计算post
  272. params["sign"] = sign;
  273. params.erase("url");
  274. //未签名之前,不能进行urlencode,签名完成之后可以(params的value必须为utf8格式)
  275. postString = "";
  276. for (std::map<string, string>::iterator it = params.begin(); it != params.end();)
  277. {
  278. postString += it->first + "=" + CLewaimaiString::UrlEncode(it->second);
  279. it++;
  280. if (it != params.end())
  281. {
  282. postString += "&";
  283. }
  284. }
  285. LOG_INFO("postString:" << postString.c_str());
  286. CHttpClient m_httpClient;
  287. int ret = m_httpClient.Posts(m_client.m_pingtai_url + url, postString, response, NULL, m_client.m_is_http_proxy, m_client.m_http_proxy_ip, m_client.m_http_proxy_port);
  288. LOG_INFO("response:" << response.c_str());
  289. if (ret == 0)
  290. {
  291. //ret为0表示没有出错
  292. return true;
  293. }
  294. return false;
  295. }
  296. bool CZhipuziHttpClient::RequestPingtaiNew(std::string url, std::map<string, string> params, std::string& response)
  297. {
  298. std::string timestamp = to_string(time(NULL));
  299. std::string nonce = "123456";
  300. std::string lwm_appid = "84b19199fd221a78c491cd553cbb4ab7";
  301. std::string open_secret = "#repast!@#AfAS#@!";
  302. //先添加默认参数,用于计算签名
  303. params["username"] = CLewaimaiString::UrlEncode(m_client.m_username);
  304. params["password"] = md5(m_client.m_password);
  305. params["lwm_appid"] = lwm_appid;
  306. params["nonce"] = nonce;
  307. params["timestamp"] = timestamp;
  308. //计算签名
  309. std::string postString;
  310. for (std::map<string, string>::iterator it = params.begin(); it != params.end(); )
  311. {
  312. postString += it->first + "=" + it->second;
  313. it++;
  314. if (it != params.end())
  315. {
  316. postString += "&";
  317. }
  318. }
  319. LOG_INFO("postString:" << postString.c_str());
  320. //用于计算签名的临时变量
  321. string tmp = md5(postString);
  322. tmp += open_secret;
  323. std::string sign = md5(tmp);
  324. transform(sign.begin(), sign.end(), sign.begin(), ::toupper);
  325. LOG_INFO("sign:" << sign.c_str());
  326. //加上签名,去掉url,计算post
  327. params["sign"] = sign;
  328. postString = "";
  329. for (std::map<string, string>::iterator it = params.begin(); it != params.end(); )
  330. {
  331. postString += it->first + "=" + it->second;
  332. it++;
  333. if (it != params.end())
  334. {
  335. postString += "&";
  336. }
  337. }
  338. LOG_INFO("postString:" << postString.c_str());
  339. CHttpClient m_httpClient;
  340. int ret = m_httpClient.Posts(m_client.m_pingtai_url + url, postString, response, NULL, m_client.m_is_http_proxy, m_client.m_http_proxy_ip, m_client.m_http_proxy_port);
  341. LOG_INFO("response:" << response.c_str());
  342. if (ret == 0)
  343. {
  344. //ret为0表示没有出错
  345. return true;
  346. }
  347. return false;
  348. }