CZhipuziHttpClient.cpp 11 KB

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