game2006api/webapp/services/BlockChainService.php
aozhiwei c9d3a20170 1
2023-08-31 15:41:36 +08:00

317 lines
9.6 KiB
PHP
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.

<?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)];
}
}