lib_unity_purchase/Editor/ServiceProjectSettings/Service/Networking/GoogleConfigurationWebReque...

196 lines
7.0 KiB
C#
Raw Normal View History

2024-01-29 18:49:33 +08:00
using System;
using System.Text;
using UnityEngine;
using UnityEngine.Networking;
namespace UnityEditor.Purchasing
{
class GoogleConfigurationWebRequests
{
const string k_GoogleKeySubPath = "/api/v2/projects/";
const string k_GoogleKeyGetSuffix = "/get_google_pub_key";
const string k_GoogleKeyPostSuffix = "/set_google_pub_key";
const string k_GoogleKeyJsonLabel = "google_pub_key";
const string k_AuthHeaderName = "Authorization";
const string k_AuthHeaderValueFormat = "Basic {0}";
const string k_ContentHeaderName = "Content-Type";
const string k_ContentHeaderValue = "application/json;charset=UTF-8";
readonly IWebRequestInternal m_WebRequest = new CloudProjectWebRequest();
UnityWebRequest m_GetGoogleKeyRequest;
readonly GoogleConfigurationData m_PurchasingRemoteDataRef;
readonly Action<string> m_GetGooglePlayKeyCallback;
readonly Action<GooglePlayRevenueTrackingKeyState> m_SetGooglePlayKeyCallback;
internal GoogleConfigurationWebRequests(GoogleConfigurationData remoteData, Action<string> onGetGooglePlayKey, Action<GooglePlayRevenueTrackingKeyState> onSetGooglePlayKey)
{
m_PurchasingRemoteDataRef = remoteData;
m_GetGooglePlayKeyCallback = onGetGooglePlayKey;
m_SetGooglePlayKeyCallback = onSetGooglePlayKey;
}
~GoogleConfigurationWebRequests()
{
CancelGetGoogleKeyRequest();
}
void CancelGetGoogleKeyRequest()
{
m_GetGoogleKeyRequest?.Abort();
m_GetGoogleKeyRequest?.Dispose();
m_GetGoogleKeyRequest = null;
}
internal void RequestRetrieveKeyOperation()
{
AuthSignatureWebRequests.RequestAuthSignature(m_WebRequest, GetGooglePlayKey);
}
void GetGooglePlayKey(string projectAuthSignature)
{
if (m_GetGoogleKeyRequest == null)
{
BuildGetGooglePlayKeyWebRequest(projectAuthSignature);
var operation = m_GetGoogleKeyRequest.SendWebRequest();
operation.completed += OnGetGooglePlayKey;
}
}
void BuildGetGooglePlayKeyWebRequest(string projectAuthSignature)
{
m_GetGoogleKeyRequest = UnityWebRequest.Get(GetGoogleKeyResource() + k_GoogleKeyGetSuffix);
m_GetGoogleKeyRequest.suppressErrorsToConsole = true;
AddAuthTokenToRequestHeader(m_GetGoogleKeyRequest, projectAuthSignature);
}
static void AddAuthTokenToRequestHeader(UnityWebRequest request, string projectAuthSignature)
{
var encodedAuthToken = NetworkingUtils.Base64Encode(NetworkingUtils.GetProjectGuid() + ":" + projectAuthSignature);
request.SetRequestHeader(k_AuthHeaderName, string.Format(k_AuthHeaderValueFormat, encodedAuthToken));
}
void OnGetGooglePlayKey(AsyncOperation getKeyOperation)
{
var webOp = (UnityWebRequestAsyncOperation)getKeyOperation;
if (webOp?.isDone == true && m_GetGoogleKeyRequest != null)
{
FetchGooglePlayKeyFromRequest();
m_GetGoogleKeyRequest.Dispose();
m_GetGoogleKeyRequest = null;
}
}
void FetchGooglePlayKeyFromRequest()
{
var googlePlayKey = "";
if (IsGoogleKeyRequestResultSuccess())
{
try
{
googlePlayKey = NetworkingUtils.GetValueFromJsonDictionary(m_GetGoogleKeyRequest.downloadHandler.text, k_GoogleKeyJsonLabel);
}
catch (Exception ex)
{
Debug.LogException(ex);
m_PurchasingRemoteDataRef.googlePlayKey = "";
}
}
else
{
m_PurchasingRemoteDataRef.googlePlayKey = "";
}
m_PurchasingRemoteDataRef.googlePlayKey = googlePlayKey;
m_GetGooglePlayKeyCallback(m_PurchasingRemoteDataRef.googlePlayKey);
}
bool IsGoogleKeyRequestResultSuccess()
{
return m_GetGoogleKeyRequest.IsResultTransferSuccess();
}
internal void RequestUpdateOperation()
{
AuthSignatureWebRequests.RequestAuthSignature(m_WebRequest, PushGooglePlayKey);
}
void PushGooglePlayKey(string projectAuthSignature)
{
var request = BuildPushGooglePlayKeyRequest(projectAuthSignature);
var operation = request.SendWebRequest();
operation.completed += OnSubmitGooglePlayKey;
}
UnityWebRequest BuildPushGooglePlayKeyRequest(string projectAuthSignature)
{
var payload = "{\"" + k_GoogleKeyJsonLabel + "\": \"" + m_PurchasingRemoteDataRef.googlePlayKey + "\"}";
var jsonUploadHandler = new UploadHandlerRaw(Encoding.UTF8.GetBytes(payload));
var request = new UnityWebRequest(GetGoogleKeyResource() + k_GoogleKeyPostSuffix,
UnityWebRequest.kHttpVerbPOST)
{
uploadHandler = jsonUploadHandler,
suppressErrorsToConsole = true
};
AddAuthTokenToRequestHeader(request, projectAuthSignature);
request.SetRequestHeader(k_ContentHeaderName, k_ContentHeaderValue);
return request;
}
void OnSubmitGooglePlayKey(AsyncOperation pushKeyOperation)
{
var pushKeyWebOperation = (UnityWebRequestAsyncOperation)pushKeyOperation;
if (pushKeyWebOperation?.isDone == true)
{
var completedRequest = pushKeyWebOperation.webRequest;
if (completedRequest != null)
{
HandleCompletedSubmitResponse(completedRequest);
}
}
}
void HandleCompletedSubmitResponse(UnityWebRequest completedRequest)
{
var keyState = completedRequest.IsResultTransferSuccess()
? GooglePlayRevenueTrackingKeyState.Verified
: completedRequest.IsResultProtocolError()
? InterpretKeyStateFromProtocolError(completedRequest.responseCode)
: GooglePlayRevenueTrackingKeyState.InvalidFormat;
m_SetGooglePlayKeyCallback(keyState);
}
static GooglePlayRevenueTrackingKeyState InterpretKeyStateFromProtocolError(long responseCode)
{
switch (responseCode)
{
case 401:
case 403:
return GooglePlayRevenueTrackingKeyState.UnauthorizedUser;
case 405:
case 500:
return GooglePlayRevenueTrackingKeyState.ServerError;
default:
return GooglePlayRevenueTrackingKeyState.InvalidFormat;
}
}
static string GetGoogleKeyResource()
{
return PurchasingUrls.analyticsApiUrl + k_GoogleKeySubPath + NetworkingUtils.GetProjectGuid();
}
}
}