초기커밋
This commit is contained in:
81
GameServer/Global/Billing/BillingSchema.cs
Normal file
81
GameServer/Global/Billing/BillingSchema.cs
Normal file
@@ -0,0 +1,81 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace GameServer
|
||||
{
|
||||
public class BillingTestAccount
|
||||
{
|
||||
public string email { get; set; } = string.Empty;
|
||||
public string password { get; set; } = string.Empty;
|
||||
}
|
||||
|
||||
public class BillingTestJwt
|
||||
{
|
||||
public string jwt { get; set; } = string.Empty;
|
||||
public int isNew { get; set; } = 0;
|
||||
public string email { get; set; } = string.Empty;
|
||||
}
|
||||
|
||||
public class BillingPurchaseRequest
|
||||
{
|
||||
public string account_id { get; set; } = string.Empty;
|
||||
public string order_id { get; set; } = string.Empty;
|
||||
}
|
||||
|
||||
public class BillingPurchaseInfos
|
||||
{
|
||||
public int status_code { get; set; } = 0;
|
||||
public string status_message { get; set; } = string.Empty;
|
||||
public List<BuilingProductOrder> data { get; set; } = new();
|
||||
}
|
||||
|
||||
public class BuilingProductOrder
|
||||
{
|
||||
public string order_id { get; set; } = string.Empty;
|
||||
public string product_meta_id { get; set; } = string.Empty;
|
||||
public int buyDateTime { get; set; } = 0;
|
||||
public string state { get; set; } = string.Empty;
|
||||
}
|
||||
|
||||
public class BillingPurchaseState
|
||||
{
|
||||
public int status_code { get; set; } = 0;
|
||||
public string status_message { get; set; } = string.Empty;
|
||||
public BuilingProductState data { get; set; } = new();
|
||||
}
|
||||
|
||||
public class BuilingProductState
|
||||
{
|
||||
public string state { get; set; } = string.Empty;
|
||||
}
|
||||
|
||||
public class BillingChangeState
|
||||
{
|
||||
public string account_id { get; set; } = string.Empty;
|
||||
public List<BillingStateList> state_list { get; set; } = new();
|
||||
}
|
||||
|
||||
public class BillingStateList
|
||||
{
|
||||
public string order_id { get; set; } = string.Empty;
|
||||
public string state { get; set; } = string.Empty;
|
||||
}
|
||||
|
||||
public class BillingStateRes
|
||||
{
|
||||
public int status_code { get; set; } = 0;
|
||||
public string status_message { get; set; } = string.Empty;
|
||||
public List<BillingResStateList> state_list { get; set; } = new();
|
||||
}
|
||||
|
||||
public class BillingResStateList
|
||||
{
|
||||
public string order_id { get; set; } = string.Empty;
|
||||
public string bulk_result { get; set; } = string.Empty;
|
||||
public string bulk_message { get; set; } = string.Empty;
|
||||
public string state { get; set; } = string.Empty;
|
||||
}
|
||||
}
|
||||
307
GameServer/Global/Billing/BillingServerConnector.cs
Normal file
307
GameServer/Global/Billing/BillingServerConnector.cs
Normal file
@@ -0,0 +1,307 @@
|
||||
using Newtonsoft.Json;
|
||||
|
||||
|
||||
|
||||
using ServerCore;
|
||||
using ServerBase;
|
||||
using ServerCommon;
|
||||
|
||||
|
||||
|
||||
namespace GameServer;
|
||||
|
||||
public class BillingServerConnector
|
||||
{
|
||||
static public string makeBillingServerURL(string url)
|
||||
{
|
||||
return $"{GameServerApp.getServerLogic().getServerConfig().BillingConfig.BaseAddress}{url}";
|
||||
}
|
||||
|
||||
//테스트 유저의 JWT 발급
|
||||
static public async Task<(Result, string jwt)> TestUserJwtIssue()
|
||||
{
|
||||
var result = OnlineConnectConfigCheck();
|
||||
if (result.isFail())
|
||||
return (result, string.Empty);
|
||||
|
||||
var billing = new BillingTestAccount() { email = "calilab@caliverse.io", password = "calilab1234!" };
|
||||
var body = JsonConvert.SerializeObject(billing);
|
||||
|
||||
var fullUrl = makeBillingServerURL($"/v1/wallet/auth/login");
|
||||
|
||||
(bool isSuccess, string resMsg) = await HttpClientHelper.sendHttpRequest( "POST", fullUrl, null, body
|
||||
, "application/json"
|
||||
, "caliverse", "1.0" );
|
||||
if (isSuccess == false)
|
||||
{
|
||||
Log.getLogger().error($"Failed billing server action : TestUserJwtIssue, msg : {resMsg}");
|
||||
result.setFail(ServerErrorCode.BillingGetPurchaseInfoFailed);
|
||||
return (result, string.Empty);
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
var test_jwt = JsonConvert.DeserializeObject<BillingTestJwt>(resMsg);
|
||||
NullReferenceCheckHelper.throwIfNull(test_jwt, () => $"test_jwt is null !!!");
|
||||
|
||||
return (result, test_jwt.jwt);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Log.getLogger().error($"Exception !!!, DeserializeObject : exception:{ex}, resMsg:{resMsg}");
|
||||
return (result, string.Empty);
|
||||
}
|
||||
}
|
||||
|
||||
//유저의 구매내역들 조회
|
||||
static public async Task<(Result, BillingPurchaseInfos?)> GetBillingPurchaseInfos(BillingPurchaseRequest billingPurchaseRequest, string jwt)
|
||||
{
|
||||
var result = OnlineConnectConfigCheck();
|
||||
if (result.isFail())
|
||||
return (result, null);
|
||||
|
||||
var body = JsonConvert.SerializeObject(billingPurchaseRequest);
|
||||
|
||||
var fullUrl = makeBillingServerURL($"/v1/shop/products");
|
||||
|
||||
(bool isSuccess, string resMsg) = await HttpClientHelper.sendHttpRequest("GET", fullUrl, jwt, body
|
||||
, "application/json"
|
||||
, "caliverse", "1.0");
|
||||
if (isSuccess == false)
|
||||
{
|
||||
Log.getLogger().error($"Failed billing server action : GetBillingPurchaseInfos, fullUrl : {fullUrl}, jwt : {jwt}, order_id : {billingPurchaseRequest.order_id}, web_account_id : {billingPurchaseRequest.account_id}, msg : {resMsg}");
|
||||
result.setFail(ServerErrorCode.BillingGetPurchaseInfoFailed);
|
||||
return (result, null);
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
var res = JsonConvert.DeserializeObject<BillingPurchaseInfos>(resMsg);
|
||||
NullReferenceCheckHelper.throwIfNull(res, () => $"res is null !!!");
|
||||
if (res.status_code != 200)
|
||||
{
|
||||
Log.getLogger().error($"Failed billing server action : GetBillingPurchaseInfo, fullUrl : {fullUrl}, jwt : {jwt}, order_id : {billingPurchaseRequest.order_id}, web_account_id : {billingPurchaseRequest.account_id}, msg : {res.status_message}");
|
||||
result.setFail(ServerErrorCode.BillingGetPurchaseInfoFailed);
|
||||
return (result, null);
|
||||
}
|
||||
|
||||
res.data.Sort((x, y) => {
|
||||
return x.buyDateTime.CompareTo(y.buyDateTime);
|
||||
});
|
||||
|
||||
return (result, res);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Log.getLogger().error($"Exception !!!, DeserializeObject : exception:{ex}, resMsg:{resMsg}");
|
||||
return (result, null);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//유저의 특정 구매 상태 조회
|
||||
static public async Task<(Result, BillingPurchaseState?)> GetBillingPurchaseInfo(BillingPurchaseRequest billingPurchaseRequest, string jwt)
|
||||
{
|
||||
var result = OnlineConnectConfigCheck();
|
||||
if (result.isFail())
|
||||
return (result, null);
|
||||
|
||||
var body = JsonConvert.SerializeObject(billingPurchaseRequest);
|
||||
|
||||
var fullUrl = makeBillingServerURL($"/v1/shop/product");
|
||||
|
||||
(bool isSuccess, string resMsg) = await HttpClientHelper.sendHttpRequest("GET", fullUrl, jwt, body
|
||||
, "application/json"
|
||||
, "caliverse", "1.0");
|
||||
if (isSuccess == false)
|
||||
{
|
||||
Log.getLogger().error($"Failed billing server action : GetBillingPurchaseInfo, fullUrl : {fullUrl}, jwt : {jwt}, order_id : {billingPurchaseRequest.order_id}, web_account_id : {billingPurchaseRequest.account_id}, msg : {resMsg}");
|
||||
result.setFail(ServerErrorCode.BillingGetPurchaseInfoFailed);
|
||||
return (result, null);
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
var res = JsonConvert.DeserializeObject<BillingPurchaseState>(resMsg);
|
||||
NullReferenceCheckHelper.throwIfNull(res, () => $"res is null !!!");
|
||||
if (res.status_code != 200)
|
||||
{
|
||||
Log.getLogger().error($"Failed billing server action : GetBillingPurchaseInfo, fullUrl : {fullUrl}, jwt : {jwt}, order_id : {billingPurchaseRequest.order_id}, web_account_id : {billingPurchaseRequest.account_id}, msg : {res.status_message}");
|
||||
result.setFail(ServerErrorCode.BillingGetPurchaseInfoFailed);
|
||||
return (result, null);
|
||||
}
|
||||
|
||||
return (result, res);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Log.getLogger().error($"Exception !!!, DeserializeObject : exception:{ex}, resMsg:{resMsg}");
|
||||
return (result, null);
|
||||
}
|
||||
}
|
||||
|
||||
//유저의 구매 상태 업데이트
|
||||
static public async Task<(Result, string)> UpdateBillingState(BillingChangeState billingChangeState, string jwt)
|
||||
{
|
||||
var result = OnlineConnectConfigCheck();
|
||||
if (result.isFail())
|
||||
return (result, string.Empty);
|
||||
|
||||
var body = JsonConvert.SerializeObject(billingChangeState);
|
||||
|
||||
var fullUrl = makeBillingServerURL($"/v1/shop/update");
|
||||
|
||||
(bool isSuccess, string resMsg) = await HttpClientHelper.sendHttpRequest("PUT", fullUrl, jwt, body
|
||||
, "application/json"
|
||||
, "caliverse", "1.0");
|
||||
|
||||
string orders_string = string.Empty;
|
||||
string states_string = string.Empty;
|
||||
foreach (var stateInfo in billingChangeState.state_list)
|
||||
{
|
||||
orders_string += $"{stateInfo.order_id},";
|
||||
states_string += $"{stateInfo.state},";
|
||||
}
|
||||
|
||||
if (isSuccess == false)
|
||||
{
|
||||
Log.getLogger().error($"Failed billing server action : UpdateBillingState, fullUrl : {fullUrl}, jwt : {jwt}, web_account_id : {billingChangeState.account_id}, order_ids : {orders_string}, update state : {states_string}, msg : {resMsg}");
|
||||
result.setFail(ServerErrorCode.BillingUpdateStateFailed);
|
||||
return (result, resMsg);
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
var res = JsonConvert.DeserializeObject<BillingStateRes>(resMsg);
|
||||
NullReferenceCheckHelper.throwIfNull(res, () => $"res is null !!!");
|
||||
if (res.status_code != 200)
|
||||
{
|
||||
Log.getLogger().error($"Failed billing server action : UpdateBillingState, fullUrl : {fullUrl}, jwt : {jwt}, web_account_id : {billingChangeState.account_id}, order_id : {orders_string}, update state : {states_string}, msg : {res.status_message}");
|
||||
result.setFail(ServerErrorCode.BillingUpdateStateFailed);
|
||||
return (result, res.status_message);
|
||||
}
|
||||
|
||||
return (result, res.status_message);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Log.getLogger().error($"Exception !!!, DeserializeObject : exception:{ex}, resMsg:{resMsg}");
|
||||
return (result, string.Empty);
|
||||
}
|
||||
}
|
||||
|
||||
static public async Task<(Result, BillingStateType)> GetBillingState(string jwt, string account_id, string packageOrderId)
|
||||
{
|
||||
var result = new Result();
|
||||
var err_msg = string.Empty;
|
||||
|
||||
var billingPurchaseRequest = new BillingPurchaseRequest() { account_id = account_id.ToString(), order_id = packageOrderId };
|
||||
(result, var state) = await GetBillingPurchaseInfo(billingPurchaseRequest, jwt);
|
||||
if (result.isFail())
|
||||
{
|
||||
return (result, BillingStateType.none);
|
||||
}
|
||||
NullReferenceCheckHelper.throwIfNull(state, () => $"state is null !!!");
|
||||
|
||||
if (EnumHelper.tryParse<BillingStateType>(state.data.state, out var stateType) == false)
|
||||
{
|
||||
err_msg = $"Enum Parse Failed. BillingStateType : {state.data.state}";
|
||||
result.setFail(ServerErrorCode.BillingStateTypeInvalid, err_msg);
|
||||
Log.getLogger().error(err_msg);
|
||||
return (result, BillingStateType.none);
|
||||
}
|
||||
|
||||
return (result, stateType);
|
||||
}
|
||||
//빌링 상태값 업데이트 가능 여부 확인
|
||||
static public async Task<(Result, bool isUpdated)> AbleToChangeBillingState(string jwt, string account_id, string packageOrderId, BillingStateType toBillingStateType)
|
||||
{
|
||||
var result = new Result();
|
||||
var err_msg = string.Empty;
|
||||
|
||||
var billingPurchaseRequest = new BillingPurchaseRequest() { account_id = account_id.ToString(), order_id = packageOrderId };
|
||||
(result, var state) = await GetBillingPurchaseInfo(billingPurchaseRequest, jwt);
|
||||
if (result.isFail())
|
||||
{
|
||||
return (result, false);
|
||||
}
|
||||
NullReferenceCheckHelper.throwIfNull(state, () => $"state is null !!!");
|
||||
|
||||
if (EnumHelper.tryParse<BillingStateType>(state.data.state, out var stateType) == false)
|
||||
{
|
||||
err_msg = $"Enum Parse Failed. BillingStateType : {state.data.state}";
|
||||
result.setFail(ServerErrorCode.BillingStateTypeInvalid, err_msg);
|
||||
Log.getLogger().error(err_msg);
|
||||
return (result, false);
|
||||
}
|
||||
|
||||
switch (toBillingStateType)
|
||||
{
|
||||
case BillingStateType.received:
|
||||
if (stateType != BillingStateType.paid)
|
||||
{
|
||||
err_msg = $"Invalid BillingState. current BillingStateType : {stateType}, toBillingStateType {toBillingStateType}";
|
||||
result.setFail(ServerErrorCode.BillingStateTypeInvalid, err_msg);
|
||||
Log.getLogger().error(err_msg);
|
||||
return (result, false);
|
||||
}
|
||||
break;
|
||||
case BillingStateType.opening:
|
||||
if (stateType == BillingStateType.refund || stateType == BillingStateType.refund_request)
|
||||
{
|
||||
err_msg = $"Invalid BillingState. current BillingStateType : {stateType}, toBillingStateType {toBillingStateType}";
|
||||
result.setFail(ServerErrorCode.BillingStateTypeRefund, err_msg);
|
||||
Log.getLogger().error(err_msg);
|
||||
return (result, false);
|
||||
}
|
||||
else if (stateType == BillingStateType.canceled)
|
||||
{
|
||||
err_msg = $"Invalid BillingState. current BillingStateType : {stateType}, toBillingStateType {toBillingStateType}";
|
||||
result.setFail(ServerErrorCode.BillingStateTypeRefundComplete, err_msg);
|
||||
Log.getLogger().error(err_msg);
|
||||
return (result, false);
|
||||
}
|
||||
else if (stateType == BillingStateType.opening || stateType == BillingStateType.opened)
|
||||
{
|
||||
return (result, true);
|
||||
}
|
||||
break;
|
||||
case BillingStateType.opened:
|
||||
if (stateType == BillingStateType.opened)
|
||||
{
|
||||
return (result, true);
|
||||
}
|
||||
else if (stateType != BillingStateType.opening)
|
||||
{
|
||||
err_msg = $"Invalid BillingState. current BillingStateType : {stateType}, toBillingStateType {toBillingStateType}";
|
||||
result.setFail(ServerErrorCode.BillingStateTypeInvalid, err_msg);
|
||||
Log.getLogger().error(err_msg);
|
||||
return (result, false);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
err_msg = $"Invalid BillingState. current BillingStateType : {stateType}, toBillingStateType {toBillingStateType}";
|
||||
result.setFail(ServerErrorCode.BillingStateTypeInvalid, err_msg);
|
||||
Log.getLogger().error(err_msg);
|
||||
return (result, false);
|
||||
}
|
||||
|
||||
return (result, false);
|
||||
}
|
||||
|
||||
static private Result OnlineConnectConfigCheck()
|
||||
{
|
||||
var result = new Result();
|
||||
|
||||
var server_config = GameServerApp.getServerLogic().getServerConfig();
|
||||
var billing_address = server_config.BillingConfig.BaseAddress;
|
||||
|
||||
if (server_config.OfflineMode == true || billing_address == string.Empty)
|
||||
{
|
||||
result.setFail(ServerErrorCode.ServerOfflineModeEnable);
|
||||
return result;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user