// Fill out your copyright notice in the Description page of Project Settings. #include "HttpTapCDKey.h" #include "HttpModule.h" #include "JsonObjectConverter.h" #include "Taptap.h" #include "Define/TapCDKeyRequest.h" #include "Interfaces/IHttpResponse.h" #define TAP_CDKEY_URL TEXT("https://poster-api.xd.cn/api/v1.0/cdk/game/submit-simple") void UHttpTapCDKey::OnProcessRequestComplete(TSharedPtr request, TSharedPtr response, bool arg) const { FTapCDKeyResponse result; if (request->GetStatus() == EHttpRequestStatus::Succeeded) { TAPLOG_D(TEXT("tapcdkey报文:%s"),*response->GetContentAsString()) if (!FJsonObjectConverter::JsonObjectStringToUStruct(*response->GetContentAsString(),&result)) { TAPLOG_E(TEXT("分析返回报文时,转化json字符串错误!")) return; } HttpTapCDKeyRequestSuccessEventHandle.Broadcast(result,request->GetStatus(),true); return; } HttpTapCDKeyRequestSuccessEventHandle.Broadcast(result,request->GetStatus(),true); } void UHttpTapCDKey::StartRequest(const FString& key) { const TSharedRef request = FHttpModule::Get().CreateRequest(); request->SetVerb(TEXT("Post")); request->SetURL(TAP_CDKEY_URL); request->SetHeader("Content-Type","application/json"); // Build Struct FTapCDKeyRequest req; req.character_id = CharacterID; req.client_id = ClientID; req.gift_code = key; req.nonce_str = NonceStr; req.timestamp = SpawnTimeStamp(); req.sign = GetSign(req.timestamp); FString content; if (!FJsonObjectConverter::UStructToJsonObjectString(req,content)) { TAPLOG_E(TEXT("请求报文时,转化json字符串错误!")) return; } TAPLOG_D(TEXT("JSON字符串::\n%s"),*content); const FTCHARToUTF8 convert(*content); TArray arr((const uint8*)convert.Get(),convert.Length()); request->SetContent(arr); request->SetTimeout(TimeOut); request->OnProcessRequestComplete().BindUObject(this,&UHttpTapCDKey::OnProcessRequestComplete); if (!request->ProcessRequest()) { UE_LOG(LogTemp,Log,TEXT("tapCDKey请求出错")) } } // int64 timestamp = (FDateTime::Now() - FDateTime(1970, 1, 1)).GetTotalMilliseconds(); int64 UHttpTapCDKey::SpawnTimeStamp() { return (FDateTime::Now() - FDateTime(1970, 1, 1)).GetTotalSeconds(); } FString UHttpTapCDKey::GetSign_Implementation(int64 timestamp) const { FString content; content.AppendInt(timestamp); content.Append(NonceStr); content.Append(ClientID); // content = TEXT("1655724586abcdeabc"); const FTCHARToUTF8 convert(*content); const auto sign = FSHA1::HashBuffer(convert.Get(),convert.Length()); return sign.ToString().ToLower(); }