int GetSecondaryVerify(std::string& data, std::string& t)
{
if (data.empty())
{
return -1;
}
//获取信息
utility::string_t kUrl = L"https://buy.itunes.apple.com/verifyReceipt";
if (t == "t")
{
kUrl = L"https://sandbox.itunes.apple.com/verifyReceipt";
}
http_client client(kUrl);
uri_builder builder(L"");
json::value obj;
obj[L"receipt-data"] = json::value(s2ws(data));
http_response response = client.request(methods::POST, builder.to_string(), obj).get();
if(response.status_code() == status_codes::OK)
{
try
{
concurrency::streams::stringstreambuf buffer;
response.body().read_to_end(buffer).get();
std::string& str = buffer.collection(); // 使用C++11提供的正则表达式库
rapidjson::Document doc;
doc.Parse<0>(str.c_str());
if (doc.GetParseError())
{
return -1;
}
INT iStatus = getDataValueInt(&doc,"status");
if (iStatus == 21007)
{
iStatus = GetSecondaryVerify(data, std::string("t"));
}
return iStatus;
}
catch (const http_exception& e)
{
std::cout << e.what() << std::endl;
}
}
return 1;
}
说明:
1、代码基于restsdk微软第三方http库,轻巧方便
2、data要进行base64转码,这里没有转码是因为客户端传过来的就是转码过的
3、post请求携带一个json数据receipt-data,而且restsdk json数据是用宽字符类型,所以要ascii到unicode转码
4、判断是不是正式环境,如果返回码为21007,那么为沙盒测试,进而递归再次请求。