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