简单记录一下代码片段,没什么特别内容。参考微信接口API

///	@brief 获取新旧openid对照
///	@param old_app_id 旧服务号appid
///	@param new_app_id 新服务号appid
///	@param old_openid_lst 旧openid列表
///	@return 成功数
int CWeChatHttp::get_new_openids_from_old_openids(const std::string& old_app_id, const std::string& access_token, std::list<std::string>& old_openid_lst)
{
	int iSucCount = 0;
	// 每次转换100个,超过微信不支持
	if (old_openid_lst.size() > 100)
	{
		return -1;
	}

	// 构造post的Json串
	Document doc;
	doc.SetObject();

	Document::AllocatorType& allocate = doc.GetAllocator();
	Value from_appid(StringRef(old_app_id.c_str()));
	doc.AddMember("from_appid", from_appid, allocate);

	// 构造json内容数组
	rapidjson::Value openid_list(rapidjson::kArrayType);
	std::list<std::string>::iterator it = old_openid_lst.begin();
	for (; it != old_openid_lst.end(); ++it)
		openid_list.PushBack(StringRef((*it).c_str()), allocate);

	doc.AddMember("openid_list", openid_list, allocate);
	StringBuffer buffer;
	rapidjson::Writer<StringBuffer> write(buffer);
	doc.Accept(write);

	// 获取Json字符串
	std::string strPostJson = buffer.GetString();

	// 采用curl发起post请求
	CURL* curl = NULL;
	CURLcode res = CURL_LAST;
	char szReqUrl[1024] = { 0 };
	std::string strResponse = "";

	curl_global_init(CURL_GLOBAL_DEFAULT);
	curl = curl_easy_init();
	if (NULL != curl)
	{
		sprintf_s(szReqUrl, "https://api.weixin.qq.com/cgi-bin/changeopenid?access_token=%s", access_token.c_str());
		// 设置POST Json
		struct curl_slist* pHeaders = NULL;
		pHeaders = curl_slist_append(pHeaders, "Accept: application/json");
		pHeaders = curl_slist_append(pHeaders, "Content-Type:application/json;charset=UTF-8");

		curl_easy_setopt(curl, CURLOPT_HTTPHEADER, pHeaders);
		curl_easy_setopt(curl, CURLOPT_URL, szReqUrl);
		curl_easy_setopt(curl, CURLOPT_POST, 1L);
		curl_easy_setopt(curl, CURLOPT_POSTFIELDS, strPostJson.c_str());
		curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, CWeChatHttp::s_write_callback);
		curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void*)&strResponse);
		curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);
		curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);

		// 阻塞式,执行完毕才返回
		res = curl_easy_perform(curl);
		if (CURLE_OK == res)
		{ // 保存对照信息表
			iSucCount = save_response(strResponse);
		}

		curl_easy_cleanup(curl);
	}

	curl_global_cleanup();

	return iSucCount;
}
///	@brief 保存微信响应内容
///	@param json响应内容
///	@return 返回转换个数
int CWeChatHttp::save_response(const std::string& response)
{
	int iRet = 0;
	Document docResponse;
	// 解析判断
	if (docResponse.Parse<0>(response.c_str()).HasParseError())
	{
		printf("[%s]rapidjson Prase failed: %d\n", __FUNCTION__, docResponse.GetParseError());
		return iRet;
	}

	// 判断是否响应错误
	if (docResponse.HasMember("errcode") && 0 != docResponse["errcode"].GetInt())
	{
		printf("[%s]response errcode: %d,errmsg: %s\n", __FUNCTION__, docResponse["errcode"].GetInt(), docResponse["errmsg"].GetString());
		return iRet;
	}

	// 判断是否返回新旧openid对照信息
	if (!docResponse.HasMember("result_list"))
	{
		printf("[%s]response not found result_list.\n", __FUNCTION__);
		return iRet;
	}

	const Value& listArray = docResponse["result_list"];
	if (listArray.IsArray())
	{
		FILE* fp = fopen(GetSaveOpenIdFile(save_conver_openid_file).c_str(), "ab+");
		if (NULL != fp)
		{
			for (SizeType i = 0; i < listArray.Size(); ++i)
			{
				const Value& value = listArray[i];
				if (value.IsObject())
				{
					if (value.HasMember("err_msg") && value.HasMember("ori_openid"))
					{
						if (0 != stricmp(value["err_msg"].GetString(), "ok"))
						{
							printf("[%s]ori_openid: %s,err_msg: %s\n", __FUNCTION__, value["ori_openid"].GetString(), value["err_msg"].GetString());
						}
						else
						{
							if (value.HasMember("new_openid"))
							{ // 转换成功
								printf("conver flag:%d\n", m_iFlag);
								//fprintf(fp, "old_openid%d:%s;new_openid%d:%s\n", m_iFlag, value["ori_openid"].GetString(), 
								//	m_iFlag, value["new_openid"].GetString());
								fprintf(fp, "%s,%s\n", value["ori_openid"].GetString(), value["new_openid"].GetString());
								m_iFlag++;
								iRet++;
							}
						}
					}
				}
			}

			fclose(fp);
			fp = NULL;
		}
		else
		{
			printf("[%s]fopen file[%s] failed: %d\n", __FUNCTION__, save_conver_openid_file.c_str(), GetLastError());
		}
	}

	return iRet;
}
Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐