DragonNest/Server/DNCashServer/DNBillingConnectionSG.cpp
2024-12-19 09:48:26 +08:00

335 lines
No EOL
12 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "StdAfx.h"
#include "DNBillingConnectionSG.h"
#include "Log.h"
#include "DNUserRepository.h"
extern TCashConfig g_Config;
#if defined(_SG)
#include "../ServerCommon/SG/Soap/CouponSoap/BasicHttpBinding_USCOREICouponService.nsmap"
#include "../ServerCommon/SG/Soap/CouponSoap/soapBasicHttpBinding_USCOREICouponServiceProxy.h"
CDNBillingConnectionSG *g_pBillingConnection = NULL;
CDNBillingConnectionSG::CDNBillingConnectionSG(void)
{
}
CDNBillingConnectionSG::~CDNBillingConnectionSG(void)
{
}
int CDNBillingConnectionSG::OnBalanceInquiry(CDNUserRepository *pUser)
{
return SendCheckBalance(pUser);
}
int CDNBillingConnectionSG::OnBuy(CDNUserRepository *pUser)
{
CDNUserRepository::TBuyItem *pBuyItem = pUser->GetBuyItem(pUser->m_cCurProductCount);
if (!pBuyItem) return ERROR_GENERIC_INVALIDREQUEST;
SendPurchaseItem(pUser, pBuyItem->BuyItem.nItemSN, pBuyItem->nPrice, 1, pBuyItem->nPrice);
return ERROR_NONE;
}
int CDNBillingConnectionSG::OnPackageBuy(CDNUserRepository *pUser)
{
SendPurchaseItem(pUser, pUser->GetPackageSN(), pUser->m_nTotalPrice, 1, pUser->m_nTotalPrice);
return ERROR_NONE;
}
int CDNBillingConnectionSG::OnGift(CDNUserRepository *pUser)
{
CDNUserRepository::TGiftItem *pGiftItem = pUser->GetGiftItem(pUser->m_cCurProductCount);
if (!pGiftItem) return ERROR_GENERIC_INVALIDREQUEST;
SendGift(pUser, pGiftItem->GiftItem.nItemSN, pGiftItem->nPrice, 1, pGiftItem->nPrice, pUser->GetReceiverAccountName());
return ERROR_NONE;
}
int CDNBillingConnectionSG::OnPackageGift(CDNUserRepository *pUser)
{
SendGift(pUser, pUser->GetPackageSN(), pUser->m_nTotalPrice, 1, pUser->m_nTotalPrice, pUser->GetReceiverAccountName());
return ERROR_NONE;
}
int CDNBillingConnectionSG::OnCoupon(CDNUserRepository *pUser)
{
SendCouponUse(pUser, pUser->GetCoupon());
return ERROR_NONE;
}
// Coupon
void CDNBillingConnectionSG::SendCouponUse(CDNUserRepository *pUser, char const *pCoupon)
{
// ÄíÆù »óÅ ȮÀÎ
BasicHttpBinding_USCOREICouponService service;
service.endpoint = g_Config.CouponServerInfo.c_str();
_ns1__ScreenCoupon query;
_ns1__ScreenCouponResponse ans;
std::string str_code = std::string(pCoupon);
int gameID = 1;
query.gameID = &gameID;
query.code = &str_code;
INT64 uiCharacterDBID = pUser->GetCharacterDBID();
query.charID = &uiCharacterDBID;
if( service.__ns1__ScreenCoupon(&query, &ans) == SOAP_OK )
{
int nBillingResult = *(ans.ScreenCouponResult->StatusCode);
int nResult = ConvertCouponResult(nBillingResult);
if( nBillingResult != 1)
{
pUser->SendCoupon(nResult);
g_Log.Log(LogType::_ERROR, pUser, L"[CHERRY:SendCouponUse] Coupon Fail! (AccountDBID:%u) %d(%d) %S \r\n", pUser->GetAccountDBID(), nResult, nBillingResult, (*ans.ScreenCouponResult->StatusDescription).c_str());
return;
}
else
{
// ¾ÆÀÌÅÛ Áö±Þ, ¾ÆÀÌÅÛ Å¸ÀÔ? 1:Dn Points, 2:Item, 3:Cash Item
// ÀÏ´Ü Ä³½¬¾ÆÀÌÅÛ¸¸
if( *ans.ScreenCouponResult->ItemType == 3 )
{
int nSerial = atoi((*ans.ScreenCouponResult->ItemID).c_str());
if( pUser->OnRecvBillingCoupon(ERROR_NONE, ERROR_NONE, nSerial, 0) == true )
{
// ÄíÆù »ç¿ëµî·Ï
_ns1__UpdateCouponStatus CouponStatusQuery;
_ns1__UpdateCouponStatusResponse CouponStatusAns;
std::string str_characterName = pUser->GetCharacterName();
std::string str_cid = pUser->GetAccountName();
std::string str_ip = pUser->m_szIp;
int gameID = 1;
INT64 CharacterID = (int)pUser->GetCharacterDBID();
CouponStatusQuery.gameID = &gameID;
CouponStatusQuery.characterID = &CharacterID;
CouponStatusQuery.characterName = &str_characterName;
CouponStatusQuery.cherryID = &str_cid;
CouponStatusQuery.code = &str_code;
CouponStatusQuery.IP = &str_ip;
if( service.__ns1__UpdateCouponStatus(&CouponStatusQuery, &CouponStatusAns) == SOAP_OK )
{
if( *CouponStatusAns.UpdateCouponStatusResult == false )
g_Log.Log(LogType::_ERROR, pUser, L"[CHERRY:SendCouponUse] Coupon UpdateStatus Fail! Coupon:%S (AccountDBID:%u)\r\n", pCoupon, pUser->GetAccountDBID());
else
return;
}
else
g_Log.Log(LogType::_ERROR, pUser, L"[CHERRY:SendCouponUse] Coupon UpdateStatus Connection Fail! Coupon:%S (AccountDBID:%u)\r\n", pCoupon, pUser->GetAccountDBID());
}
else
{
g_Log.Log(LogType::_ERROR, pUser, L"[CHERRY:SendCouponUse] OnRecvBillingCoupon false! Coupon:%S (AccountDBID:%u)\r\n", pCoupon, pUser->GetAccountDBID());
return; // OnRecvBillingCoupon ¾È¿¡¼­ sendº¸³¿.
}
}
else
g_Log.Log(LogType::_ERROR, pUser, L"[CHERRY:SendCouponUse] Coupon Fail! Coupon:%S ItemType:%d (AccountDBID:%u)\r\n", pCoupon, *ans.ScreenCouponResult->ItemType, pUser->GetAccountDBID());
}
}
else
g_Log.Log(LogType::_ERROR, pUser, L"[CHERRY:SendCouponUse] Coupon Fail! (AccountDBID:%u) %d Connection Fail! \r\n", pUser->GetAccountDBID(), ERROR_GENERIC_UNKNOWNERROR);
pUser->SendCoupon(ERROR_GENERIC_UNKNOWNERROR);
return;
}
int CDNBillingConnectionSG::SendCheckBalance(CDNUserRepository *pUser)
{
ReceivedData result;
UINT uiOderID = MakeOrderID();
result = Transaction::GetBalance(g_Config.AuthToken.c_str(), pUser->GetWorldID(), pUser->GetAccountName(), uiOderID);
if( result.StatusID == 30 ) // Error_None
pUser->SendBalanceInquiry(ERROR_NONE, result.CherryCredits);
else
{
g_Log.Log(LogType::_ERROR, pUser, L"[CHERRY:SendCheckBalance] Fail!! (AccountDBID:%u) Order:%u result:%d \r\n", pUser->GetAccountDBID(), uiOderID, result.StatusID);
return ERROR_GENERIC_INVALIDREQUEST;
}
return ERROR_NONE;
}
void CDNBillingConnectionSG::SendPurchaseItem(CDNUserRepository *pUser, UINT uiProductID, UINT uiUnitPrice, UINT uiQuantity, UINT uiTotalAmount)
{
ReceivedData result;
UINT uiOderID = MakeOrderID();
result = Transaction::GetPurchase(g_Config.AuthToken.c_str(), pUser->GetWorldID(), pUser->GetAccountName(), uiOderID, uiProductID, uiUnitPrice,
uiQuantity, uiTotalAmount, pUser->m_szIp);
if( result.StatusID == 10 || result.StatusID == 30 ||result.StatusID == 11) // Error_None
{
// Compelete
result = Transaction::GetCompleted(g_Config.AuthToken.c_str(), pUser->GetWorldID(), pUser->GetAccountName(), uiOderID, result.TransactionID);
if( result.StatusID == 10 || result.StatusID == 30 )
{
pUser->OnRecvBillingBuyItem(ERROR_NONE);
return;
}
else if( result.StatusID == 11 ) // CC deducted, pending to complete
{
if( GetStatus(g_Config.AuthToken.c_str(), pUser->GetWorldID(), pUser->GetAccountName(), uiOderID,uiProductID, uiTotalAmount) == true )
{
pUser->OnRecvBillingBuyItem(ERROR_NONE);
return;
}
}
pUser->OnRecvBillingBuyItem(ERROR_GENERIC_UNKNOWNERROR);
g_Log.Log(LogType::_ERROR, pUser, L"[CHERRY:SendPurchaseItem] GetCompleted Fail!! (AccountDBID:%u) Order:%u result:%d ProductID:%u \r\n", pUser->GetAccountDBID(), uiOderID, result.StatusID, uiProductID);
return;
}
else if( result.ServerID == 25 ) //Order ID does not exist
{
if( GetStatus(g_Config.AuthToken.c_str(), pUser->GetWorldID(), pUser->GetAccountName(), uiOderID,uiProductID, uiTotalAmount) == true )
{
// Compelete
result = Transaction::GetCompleted(g_Config.AuthToken.c_str(), pUser->GetWorldID(), pUser->GetAccountName(), uiOderID, result.TransactionID);
if( result.StatusID == 10 || result.StatusID == 30 )
{
pUser->OnRecvBillingBuyItem(ERROR_NONE);
return;
}
else if( result.StatusID == 11 ) // CC deducted, pending to complete
{
if( GetStatus(g_Config.AuthToken.c_str(), pUser->GetWorldID(), pUser->GetAccountName(), uiOderID,uiProductID, uiTotalAmount) == true )
{
pUser->OnRecvBillingBuyItem(ERROR_NONE);
return;
}
}
pUser->OnRecvBillingBuyItem(ERROR_GENERIC_UNKNOWNERROR);
g_Log.Log(LogType::_ERROR, pUser, L"[CHERRY:SendPurchaseItem] GetCompleted Fail!! (AccountDBID:%u) Order:%u result:%d ProductID:%u \r\n", pUser->GetAccountDBID(), uiOderID, result.StatusID, uiProductID);
return;
}
}
pUser->OnRecvBillingBuyItem(ERROR_GENERIC_UNKNOWNERROR);
g_Log.Log(LogType::_ERROR, pUser, L"[CHERRY:SendPurchaseItem] GetPurchase Fail!! (AccountDBID:%u) Order:%u result:%d ProductID:%u \r\n", pUser->GetAccountDBID(), uiOderID, result.StatusID, uiProductID);
}
void CDNBillingConnectionSG::SendGift(CDNUserRepository *pUser, UINT uiProductID, UINT uiUnitPrice, UINT uiQuantity, UINT uiTotalAmount, const char* ToCherryID)
{
ReceivedData result;
UINT uiOderID = MakeOrderID();
result = Transaction::GetSendGift(g_Config.AuthToken.c_str(), pUser->GetWorldID(), pUser->GetAccountName(), uiOderID, uiProductID, uiUnitPrice,
uiQuantity, uiTotalAmount, ToCherryID, pUser->m_szIp);
if( result.StatusID == 10 || result.StatusID == 30 || result.StatusID == 11) // Error_None
{
// Compelete
result = Transaction::GetCompleted(g_Config.AuthToken.c_str(), pUser->GetWorldID(), pUser->GetAccountName(), uiOderID, result.TransactionID);
if( result.StatusID == 10 || result.StatusID == 30 )
{
pUser->OnRecvBillingBuyItem(ERROR_NONE);
return;
}
else if( result.StatusID == 11 ) // CC deducted, pending to complete
{
if( GetStatus(g_Config.AuthToken.c_str(), pUser->GetWorldID(), pUser->GetAccountName(), uiOderID,uiProductID, uiTotalAmount) == true )
{
pUser->OnRecvBillingBuyItem(ERROR_NONE);
return;
}
}
pUser->OnRecvBillingBuyItem(ERROR_GENERIC_UNKNOWNERROR);
g_Log.Log(LogType::_ERROR, pUser, L"[CHERRY:SendGift] GetCompleted Fail!! (AccountDBID:%u) Order:%u result:%d ProductID:%u \r\n", pUser->GetAccountDBID(), uiOderID, result.StatusID, uiProductID);
return;
}
else if( result.ServerID == 25 ) //Order ID does not exist
{
if( GetStatus(g_Config.AuthToken.c_str(), pUser->GetWorldID(), pUser->GetAccountName(), uiOderID,uiProductID, uiTotalAmount) == true )
{
// Compelete
result = Transaction::GetCompleted(g_Config.AuthToken.c_str(), pUser->GetWorldID(), pUser->GetAccountName(), uiOderID, result.TransactionID);
if( result.StatusID == 10 || result.StatusID == 30 )
{
pUser->OnRecvBillingBuyItem(ERROR_NONE);
return;
}
else if( result.StatusID == 11 ) // CC deducted, pending to complete
{
if( GetStatus(g_Config.AuthToken.c_str(), pUser->GetWorldID(), pUser->GetAccountName(), uiOderID,uiProductID, uiTotalAmount) == true )
{
pUser->OnRecvBillingBuyItem(ERROR_NONE);
return;
}
}
pUser->OnRecvBillingBuyItem(ERROR_GENERIC_UNKNOWNERROR);
g_Log.Log(LogType::_ERROR, pUser, L"[CHERRY:SendGift] GetCompleted Fail!! (AccountDBID:%u) Order:%u result:%d ProductID:%u\r\n", pUser->GetAccountDBID(), uiOderID, result.StatusID, uiProductID);
return;
}
}
pUser->OnRecvBillingBuyItem(ERROR_GENERIC_UNKNOWNERROR);
g_Log.Log(LogType::_ERROR, pUser, L"[CHERRY:SendGift] GetSendGift Fail!! (AccountDBID:%u) Order:%u result:%d ProductID:%u \r\n", pUser->GetAccountDBID(), uiOderID, result.StatusID, uiProductID);
}
// GetPurchase, GetSendGift, GetCompleted °Ë»ç
bool CDNBillingConnectionSG::GetStatus(const char* AuthToken, char ServerID, const char* CherryID, unsigned int OrderID, unsigned int ProductID, unsigned int TotalAmount)
{
ReceivedData result;
for( int i=0; i<3; ++i )
{
result = Transaction::GetStatus(AuthToken, ServerID, CherryID, OrderID, ProductID, TotalAmount);
if( result.StatusID == 10 || result.StatusID == 30 )
return true;
}
g_Log.Log(LogType::_ERROR, L"[CHERRY:GetStatus] GetStatus Fail!! Order:%u result:%d ProductID:%u\r\n", OrderID, result.StatusID, ProductID);
return false;
}
int CDNBillingConnectionSG::ConvertCouponResult(int nResult)
{
int nRet = ERROR_GENERIC_UNKNOWNERROR;
switch(nResult)
{
case -1 : nRet = ERROR_CHERRY_COUPON_ALREADY; break;
case -2 : nRet = ERROR_CHERRY_COUPON_EXPRIED; break;
case -3 : nRet = ERROR_CHERRY_COUPON_INVALID; break;
case -4 : nRet = ERROR_CHERRY_COUPON_AND_CHARACTERID_MISMATCH; break;
case -99 :
case -999 :
nRet = ERROR_GENERIC_UNKNOWNERROR;
break;
}
return nRet;
}
int CDNBillingConnectionSG::ConvertBillingResult(int nResult)
{
int nRet = ERROR_GENERIC_UNKNOWNERROR;
switch(nResult)
{
case -1 : nRet = ERROR_CHERRY_COUPON_ALREADY; break;
case -2 : nRet = ERROR_CHERRY_COUPON_EXPRIED; break;
case -3 : nRet = ERROR_CHERRY_COUPON_INVALID; break;
case -99 :
case -999 :
nRet = ERROR_GENERIC_UNKNOWNERROR;
break;
}
return nRet;
}
UINT CDNBillingConnectionSG::MakeOrderID()
{
static long Adder = rand();
time_t CreateTime;
time(&CreateTime);
tm *tm_ptr = localtime(&CreateTime);
long Local = static_cast<short>(InterlockedIncrement( &Adder ));
UINT nTest = (static_cast<UINT>(tm_ptr->tm_mday&0xF)<<28) | (static_cast<UINT>(tm_ptr->tm_hour&0xF)<<24)
| (static_cast<UINT>(tm_ptr->tm_min&0xF)<<20) | (static_cast<UINT>(tm_ptr->tm_sec&0xF)<<16) | (Local&0xFFFF);
return nTest;
}
#endif // #if defined(_SG)