317 lines
9.6 KiB
PHP
317 lines
9.6 KiB
PHP
<?php
|
||
|
||
namespace services;
|
||
|
||
require_once('models/Transaction.php');
|
||
require_once('phpcommon/bignumber.php');
|
||
|
||
use models\Transaction;
|
||
use phpcommon;
|
||
|
||
class BlockChainService {
|
||
|
||
const CURRENCY_CEG = 'CEG';
|
||
const CURRENCY_USDC = 'USDC';
|
||
const CURRENCY_USDT = 'USDT';
|
||
|
||
/*
|
||
注意!!!:
|
||
调用方调用前需要校验actionType和myself()->_getAddress,
|
||
非法的参数,或者签名服挂了,该函数直接中断请求,不会运行到调用方后续逻辑
|
||
|
||
trans_id:订单id
|
||
|
||
gameItemMallBuy
|
||
setv
|
||
a
|
||
b
|
||
c
|
||
*/
|
||
|
||
public static function gameItemMallBuy($actionType, $currency, $price, $itemId, $itemNum)
|
||
{
|
||
if (!($actionType > Transaction::BUY_BEGIN_ACTION_TYPE &&
|
||
$actionType < Transaction::BUY_END_ACTION_TYPE)) {
|
||
error_log('gameItemMallBuy action_type error:' . $actionType);
|
||
myself()->_rspErr(500, 'server internal error 1');
|
||
die();
|
||
return;
|
||
}
|
||
$account = myself()->_getAddress();
|
||
if (empty($account)) {
|
||
error_log('gameItemMallBuy address is emtpy:' . myself()->_getAccountId());
|
||
myself()->_rspErr(500, 'server internal error 2');
|
||
die();
|
||
return;
|
||
}
|
||
$params = array(
|
||
'c' => 'GameItemMall',
|
||
'a' => 'buy',
|
||
'account' => $account,
|
||
'currency_name' => $currency,
|
||
'price' => $price,
|
||
'net_id' => NET_ID
|
||
);
|
||
{
|
||
$url = self::getWeb3ServiceUrl();
|
||
$response = '';
|
||
if (!phpcommon\HttpClient::get
|
||
($url,
|
||
$params,
|
||
$response)) {
|
||
myself()->_rspErr(500, 'server internal error 3, url:' . $url);
|
||
die();
|
||
return;
|
||
}
|
||
error_log("gameItemMallBuy:" . $response . "url:" . $url);
|
||
$rspObj = json_decode($response, true);
|
||
if ($rspObj['errcode'] == 0) {
|
||
$transId = $rspObj['trans_id'];
|
||
Transaction::add(
|
||
$transId,
|
||
$actionType,
|
||
'', //$tokenId,
|
||
'', //$tokenType,
|
||
0, //$itemUniId,
|
||
$itemId, //$itemId,
|
||
$itemNum,
|
||
1
|
||
);
|
||
return array(
|
||
'trans_id' => $transId,
|
||
'params' => $rspObj['params']
|
||
);
|
||
} else {
|
||
myself()->_rspErr(500, 'server internal error 4');
|
||
die();
|
||
return;
|
||
}
|
||
}
|
||
}
|
||
|
||
/*
|
||
注意!!!:
|
||
调用方调用前需要校验actionType和myself()->_getAddress,
|
||
非法的参数,或者签名服挂了,该函数直接中断请求,不会运行到调用方后续逻辑
|
||
|
||
trans_id:订单id
|
||
|
||
gameItemMarketBuy
|
||
setv
|
||
a
|
||
b
|
||
c
|
||
*/
|
||
|
||
public static function gameItemMarketBuy($actionType, $seller, $currency, $price, $itemId, $itemNum, $orderId)
|
||
{
|
||
if (!($actionType > Transaction::BUY_BEGIN_ACTION_TYPE &&
|
||
$actionType < Transaction::BUY_END_ACTION_TYPE)) {
|
||
error_log('gameItemMarketBuy action_type error:' . $actionType);
|
||
myself()->_rspErr(500, 'server internal error 1');
|
||
die();
|
||
return;
|
||
}
|
||
$account = myself()->_getAddress();
|
||
if (empty($account)) {
|
||
error_log('gameItemMarketBuy address is emtpy:' . myself()->_getAccountId());
|
||
myself()->_rspErr(500, 'server internal error 2');
|
||
die();
|
||
return;
|
||
}
|
||
$params = array(
|
||
'c' => 'GameItemMarket',
|
||
'a' => 'buy',
|
||
'account' => $account,
|
||
'currency_name' => $currency,
|
||
'price' => $price,
|
||
'seller' => $seller,
|
||
'order_id' => $orderId,
|
||
'net_id' => NET_ID
|
||
);
|
||
{
|
||
$url = self::getWeb3ServiceUrl();
|
||
$response = '';
|
||
if (!phpcommon\HttpClient::get
|
||
($url,
|
||
$params,
|
||
$response)) {
|
||
myself()->_rspErr(500, 'server internal error 3, url:' . $url);
|
||
die();
|
||
return;
|
||
}
|
||
error_log("gameItemMarketBuy:" . $response . "url:" . $url);
|
||
$rspObj = json_decode($response, true);
|
||
if ($rspObj['errcode'] == 0) {
|
||
$transId = $rspObj['trans_id'];
|
||
Transaction::add(
|
||
$transId,
|
||
$actionType,
|
||
'', //$tokenId,
|
||
'', //$tokenType,
|
||
0, //$itemUniId,
|
||
$itemId, //$itemId,
|
||
$itemNum,
|
||
1
|
||
);
|
||
return array(
|
||
'trans_id' => $transId,
|
||
'params' => $rspObj['params']
|
||
);
|
||
} else {
|
||
myself()->_rspErr(500, 'server internal error 4');
|
||
die();
|
||
return;
|
||
}
|
||
}
|
||
}
|
||
|
||
public static function beNftMallTransBuyPlanet($actionType, $address, $ids, $currency, $price)
|
||
{
|
||
if (!($actionType > Transaction::BUY_BEGIN_ACTION_TYPE &&
|
||
$actionType < Transaction::BUY_END_ACTION_TYPE)) {
|
||
error_log('beNftMallTransBuyPlanet action_type error:' . $actionType);
|
||
myself()->_rspErr(500, 'server internal error 1');
|
||
die();
|
||
return;
|
||
}
|
||
$account = $address;
|
||
if (empty($account)) {
|
||
error_log('beNftMallTransBuyPlanet address is emtpy:');
|
||
myself()->_rspErr(500, 'server internal error 2');
|
||
die();
|
||
return;
|
||
}
|
||
$params = array(
|
||
'c' => 'BeNftMallTrans',
|
||
'a' => 'buyPlanet',
|
||
'account' => $account,
|
||
'currency_name' => $currency,
|
||
'price' => $price,
|
||
'ids' => json_encode($ids),
|
||
'net_id' => NET_ID
|
||
);
|
||
{
|
||
$url = self::getWeb3ServiceUrl();
|
||
$response = '';
|
||
if (!phpcommon\HttpClient::get
|
||
($url,
|
||
$params,
|
||
$response)) {
|
||
myself()->_rspErr(500, 'server internal error 3, url:' . $url);
|
||
die();
|
||
return;
|
||
}
|
||
error_log("beNftMallTransBuyPlanet:" . $response . "url:" . $url);
|
||
$rspObj = json_decode($response, true);
|
||
if ($rspObj['errcode'] == 0) {
|
||
$transId = $rspObj['trans_id'];
|
||
Transaction::addEx(
|
||
$address,
|
||
$transId,
|
||
$actionType,
|
||
'', //$tokenId,
|
||
'', //$tokenType,
|
||
0, //$itemUniId,
|
||
0, //$itemId, //$itemId,
|
||
0, //$itemNum,
|
||
1
|
||
);
|
||
return array(
|
||
'trans_id' => $transId,
|
||
'params' => $rspObj['params']
|
||
);
|
||
} else {
|
||
myself()->_rspErr(500, 'server internal error 4');
|
||
die();
|
||
return;
|
||
}
|
||
}
|
||
}
|
||
|
||
/*
|
||
$price 是一个小数精确到小数点后5位
|
||
*/
|
||
public static function formatCurrency($price)
|
||
{
|
||
$xiShu = 10000;
|
||
$intPrice = $price * $xiShu;
|
||
$formatedStr = phpcommon\bnDiv_s(phpcommon\bnMul_s($intPrice, phpcommon\bnPow_s(10, 18)), $xiShu);
|
||
return $formatedStr;
|
||
}
|
||
|
||
public static function getCurrencyDecimals($currencyName)
|
||
{
|
||
switch ($currencyName) {
|
||
case self::CURRENCY_CEG:
|
||
{
|
||
return 18;
|
||
}
|
||
break;
|
||
case self::CURRENCY_USDC:
|
||
{
|
||
return 6;
|
||
}
|
||
break;
|
||
case self::CURRENCY_USDT:
|
||
{
|
||
return 6;
|
||
}
|
||
break;
|
||
default:
|
||
{
|
||
return false;
|
||
}
|
||
break;
|
||
}
|
||
}
|
||
|
||
public static function parseCurrencyVal($currencyName, $val, &$intPart, &$floatPart, &$maxFloatPart)
|
||
{
|
||
$decimals = self::getCurrencyDecimals($currencyName);
|
||
if ($decimals === false) {
|
||
return false;
|
||
}
|
||
$maxFloatPart = pow(10, $decimals);
|
||
$intPart = '0';
|
||
$floatPart = '0';
|
||
if (strlen($val) <= $decimals) {
|
||
$floatPart = $val;
|
||
} else {
|
||
$intPart = substr($val, 0, strlen($val) - $decimals);
|
||
$floatPart = substr($val, strlen($val) - $decimals);
|
||
}
|
||
/*
|
||
error_log(json_encode(array(
|
||
'val' => $val,
|
||
'int_part' => $intPart,
|
||
'float_part' => $floatPart,
|
||
)));*/
|
||
return true;
|
||
}
|
||
|
||
/*
|
||
$price 是一个小数精确到小数点后5位
|
||
*/
|
||
public static function formatCurrencyEx($price, $jinDu)
|
||
{
|
||
$xiShu = 10000;
|
||
$intPrice = $price * $xiShu;
|
||
$formatedStr = phpcommon\bnDiv_s(phpcommon\bnMul_s($intPrice, phpcommon\bnPow_s(10, $jinDu)), $xiShu);
|
||
return $formatedStr;
|
||
}
|
||
|
||
private static function getWeb3ServiceUrl()
|
||
{
|
||
if (SERVER_ENV == _DEBUG) {
|
||
return 'https://192.144.140.87/webapp/index.php';
|
||
}
|
||
if (SERVER_ENV == _TEST) {
|
||
return 'http://127.0.0.1:7672/webapp/index.php';
|
||
}
|
||
$web3ServiceCluster = require_once('../config/web3service.cluster.php');
|
||
return $web3ServiceCluster[rand() % count($web3ServiceCluster)];
|
||
}
|
||
|
||
}
|