Commit accc1a5c authored by shajiaiming's avatar shajiaiming

Merge branch 'master' into feature/issue_coin

parents cf53079d 894eb0ac
...@@ -131,7 +131,7 @@ class CoinController extends BaseController ...@@ -131,7 +131,7 @@ class CoinController extends BaseController
if ($recommend) { if ($recommend) {
$condition['recommend'] = $recommend; $condition['recommend'] = $recommend;
} }
$select = ['id', 'sid', 'icon', 'name', 'optional_name', 'nickname', 'platform', 'chain', 'treaty']; $select = ['id', 'sid', 'icon', 'name', 'introduce', 'optional_name', 'nickname', 'platform', 'chain', 'treaty'];
$order_by = ['sort' => SORT_ASC]; $order_by = ['sort' => SORT_ASC];
$datas = CoinRecommend::getList($page, $limit, $condition, $order_by, $select); $datas = CoinRecommend::getList($page, $limit, $condition, $order_by, $select);
//获取详细信息 //获取详细信息
...@@ -143,6 +143,8 @@ class CoinController extends BaseController ...@@ -143,6 +143,8 @@ class CoinController extends BaseController
foreach ($coin_infos as $key => &$val) { foreach ($coin_infos as $key => &$val) {
$nickname = json_decode($val['nickname'], true); $nickname = json_decode($val['nickname'], true);
$val['nickname'] = $nickname[$this->lang]; $val['nickname'] = $nickname[$this->lang];
$introduce = json_decode($val['introduce'], true);
$val['introduce'] = $introduce[$this->lang];
} }
//获取行情信息 //获取行情信息
$coin_names = array_column($coin_infos, 'name'); $coin_names = array_column($coin_infos, 'name');
...@@ -243,7 +245,9 @@ class CoinController extends BaseController ...@@ -243,7 +245,9 @@ class CoinController extends BaseController
} }
foreach ($result['data'] as $key => &$value) { foreach ($result['data'] as $key => &$value) {
$nickname = json_decode($value['nickname'], true); $nickname = json_decode($value['nickname'], true);
$introduce = json_decode($value['introduce'], true);
$value['nickname'] = $nickname[$this->lang]; $value['nickname'] = $nickname[$this->lang];
$value['introduce'] = $introduce[$this->lang];
$value['chain_quotation'] = $chain_quotation[$value['chain']] ?: null; $value['chain_quotation'] = $chain_quotation[$value['chain']] ?: null;
$value['chain_rmb'] = isset($value['chain_quotation']['rmb']) ? $value['chain_quotation']['rmb'] : 0; $value['chain_rmb'] = isset($value['chain_quotation']['rmb']) ? $value['chain_quotation']['rmb'] : 0;
$value['chain_usd'] = isset($value['chain_quotation']['usd']) ? $value['chain_quotation']['usd'] : 0; $value['chain_usd'] = isset($value['chain_quotation']['usd']) ? $value['chain_quotation']['usd'] : 0;
......
<?php
namespace api\controllers;
use linslin\yii2\curl\Curl;
use Yii;
use api\base\BaseController;
class CoinDogController extends BaseController
{
public function actionArticle()
{
$coindog = Yii::$app->params['coindog'];
$accessKey = $coindog['accessKey'];
$secretKey = $coindog['secretKey'];
$httpParams = array(
'access_key' => $accessKey,
'date' => time()
);
$signParams = array_merge($httpParams, array('secret_key' => $secretKey));
ksort($signParams);
$signString = http_build_query($signParams);
$httpParams['sign'] = strtolower(md5($signString));
$url = $coindog['article'] . '?' . http_build_query($httpParams);
$curl = new Curl();
$resp = $curl->get($url, false);
return ['code' => 200, 'data' => $resp, 'msg' => 'ok'];
}
public function actionLive()
{
$limit = Yii::$app->request->get('limit', 20);
$id = Yii::$app->request->get('id', 0);
$flag = Yii::$app->request->get('flag', 'down');
$coindog = Yii::$app->params['coindog'];
$accessKey = $coindog['accessKey'];
$secretKey = $coindog['secretKey'];
$httpParams = array(
'access_key' => $accessKey,
'date' => time()
);
$signParams = array_merge($httpParams, array('secret_key' => $secretKey));
ksort($signParams);
$signString = http_build_query($signParams);
$httpParams = [
'sign' => strtolower(md5($signString)),
'limit' => $limit,
'id' => $id,
'flag' => $flag
];
$url = $coindog['live'] . '?' . http_build_query($httpParams);
$curl = new Curl();
$resp = $curl->get($url, false);
if (!isset($resp['list'])) {
$msg = '数据不存在';
$code = -1;
$data = null;
goto doEnd;
}
$list = $resp['list'][0]['lives'];
foreach ($list as &$item) {
preg_match_all("/\【(.+?)\】/", $item['content'], $match);
$item['title'] = $match[1][0];
}
$code = 0;
$msg = 'success';
doEnd :
return ['code' => $code, 'data' => $list, 'msg' => $msg];
}
}
\ No newline at end of file
...@@ -51,6 +51,8 @@ class CrossChainController extends BaseController ...@@ -51,6 +51,8 @@ class CrossChainController extends BaseController
$model = new CoinCrossChain(); $model = new CoinCrossChain();
$data['txhex'] = $val['tx']; $data['txhex'] = $val['tx'];
$data['transfer_url'] = $val['url']; $data['transfer_url'] = $val['url'];
$data['step'] = $val['step'];
$data['amount'] = isset($val['amount']) ? $val['amount'] : 0;
$model->load($data, ''); $model->load($data, '');
$model->save(); $model->save();
} }
...@@ -61,12 +63,68 @@ class CrossChainController extends BaseController ...@@ -61,12 +63,68 @@ class CrossChainController extends BaseController
return ['code' => $code, 'msg' => $msg]; return ['code' => $code, 'msg' => $msg];
} }
public function actionFixTransfer()
{
$code = -1;
$request = Yii::$app->request;
if (!$request->isPost) {
$msg = '请求错误!';
goto doEnd;
}
$post = $request->post();
$data['is_with_draw'] = (false == $post['isWithdraw']) ? 0 : 1;
$data['address'] = $post['address'];
foreach ($post['txs'] as $key => $val) {
$model = CoinCrossChain::find()->where(['is_with_draw' => $data['is_with_draw']])
->andWhere(['address' => $data['address']])
->andWhere(['step' => $val['step']])
->andWhere(['<>', 'msg', 'success'])
->one();
if(false == $model) continue;
$node_params = $model->transfer_url;
$node_params = explode(':', $node_params);
$node_params = [
'scheme' => $node_params[0],
'host' => str_replace('//', '', $node_params[1]),
'port' => isset($node_params[2]) ? $node_params[2] : ''
];
$service = new Chain33Service($node_params);
$send_result = $model->send_result;
$result = $service->QueryTransaction($send_result);
if (isset($result['result']['actionName']) && 'unknown' == $result['result']['actionName']) {
$model->query_result = 'success';
$model->msg = 'success';
$model->save();
continue;
} else if (isset($result['result']['receipt']['ty']) && 2 == $result['result']['receipt']['ty']) {
$model->query_result = 'success';
$model->msg = 'success';
$model->save();
continue;
} else {
$model->txhex = $val['tx'];
$model->transfer_url = $val['url'];
$model->send_result = 0;
$model->query_result = 0;
$model->msg = 0;
$model->save();
continue;
}
}
$code = 0;
$msg = 'success';
doEnd :
return ['code' => $code, 'msg' => $msg];
}
public function actionTransferStatus() public function actionTransferStatus()
{ {
$code = -1; $code = -1;
$msg = 'fail'; $msg = 'fail';
$data = null; $data = null;
$step = 0; $step = $amount = 0;
$request = Yii::$app->request; $request = Yii::$app->request;
if (!$request->isGet) { if (!$request->isGet) {
$msg = '请求错误!'; $msg = '请求错误!';
...@@ -83,11 +141,13 @@ class CrossChainController extends BaseController ...@@ -83,11 +141,13 @@ class CrossChainController extends BaseController
$model = CoinCrossChain::find()->where(['address' => $address, 'is_with_draw' => $is_with_draw])->orderBy("id desc")->limit(3)->asArray()->all(); $model = CoinCrossChain::find()->where(['address' => $address, 'is_with_draw' => $is_with_draw])->orderBy("id desc")->limit(3)->asArray()->all();
if (empty($model)) { if (empty($model)) {
$msg = '数据不存在!'; $msg = '数据不存在!';
$code = 0;
goto doEnd; goto doEnd;
} }
sort($model); sort($model);
foreach ($model as $key => $val) { foreach ($model as $key => $val) {
$amount = $val['amount'];
//未交易 //未交易
if ('0' == $val['send_result'] && '0' == $val['query_result'] && '0' == $val['msg']) { if ('0' == $val['send_result'] && '0' == $val['query_result'] && '0' == $val['msg']) {
$step = $key + 1; $step = $key + 1;
...@@ -111,7 +171,7 @@ class CrossChainController extends BaseController ...@@ -111,7 +171,7 @@ class CrossChainController extends BaseController
goto doEnd; goto doEnd;
} }
//交易成功,查询失败 //交易成功,查询失败
if (true == $val['send_result'] && 'fail' == $val['query_result']) { if (true == $val['send_result'] && 'success' != $val['query_result']) {
$step = $key + 1; $step = $key + 1;
$code = -1; $code = -1;
$msg = $val['msg']; $msg = $val['msg'];
...@@ -119,7 +179,7 @@ class CrossChainController extends BaseController ...@@ -119,7 +179,7 @@ class CrossChainController extends BaseController
} }
//交易成功,查询成功 //交易成功,查询成功
if (true == $val['send_result'] && 'success' == $val['query_result'] && 'success' == $val['msg']) { if (true == $val['send_result'] && 'success' == $val['query_result'] && 'success' == $val['msg']) {
if (2 == $key){ if (2 == $key) {
$step = (2 == $key) ? 4 : ($key + 2); $step = (2 == $key) ? 4 : ($key + 2);
$code = 0; $code = 0;
$msg = $val['send_result']; $msg = $val['send_result'];
...@@ -131,7 +191,8 @@ class CrossChainController extends BaseController ...@@ -131,7 +191,8 @@ class CrossChainController extends BaseController
doEnd : doEnd :
$data = [ $data = [
'step' => $step 'step' => $step,
'amount' => (int)$amount
]; ];
return ['code' => $code, 'msg' => $msg, 'data' => $data]; return ['code' => $code, 'msg' => $msg, 'data' => $data];
} }
......
...@@ -23,10 +23,10 @@ class GameBetController extends BaseController ...@@ -23,10 +23,10 @@ class GameBetController extends BaseController
} }
$query = CoinGameBet::find() $query = CoinGameBet::find()
->select('round, player, amount, height, guess_num, guess_num, rand_num, player_win, platform') ->select('round, player, amount, height, guess_num, valid, rand_num, player_win, platform')
->where('player= :player',[':player' => $player]) ->where('player= :player',[':player' => $player])
->andWhere(['platform' => $platform]) ->andWhere(['platform' => $platform])
#->andWhere(['valid' => CoinGameBet::VAILD_TRUE]) //->andWhere(['valid' => CoinGameBet::VAILD_TRUE])
->orderBy('update_time desc'); ->orderBy('update_time desc');
$count = $query->count(); $count = $query->count();
......
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
* Date: 2018/12/29 * Date: 2018/12/29
* Time: 16:26 * Time: 16:26
*/ */
namespace api\controllers; namespace api\controllers;
use api\base\BaseController; use api\base\BaseController;
...@@ -33,23 +34,23 @@ class ServiceController extends BaseController ...@@ -33,23 +34,23 @@ class ServiceController extends BaseController
public function actionCoinTickers() public function actionCoinTickers()
{ {
$request = Yii::$app->request; $request = Yii::$app->request;
$coinItems = $request->post('names'); $coinItems = $request->post('names');
if(!$coinItems){ if (!$coinItems) {
return ['code' => 1,'data' => [],'msg' => '币种不能为空']; return ['code' => 1, 'data' => [], 'msg' => '币种不能为空'];
} }
if(!is_array($coinItems)){ if (!is_array($coinItems)) {
$coinItems = [$coinItems]; $coinItems = [$coinItems];
} }
$tol_coins = ['ETC']; $tol_coins = ['ETC'];
$tickerData = []; $tickerData = [];
if($coinItems){ if ($coinItems) {
foreach($coinItems as $item){ foreach ($coinItems as $item) {
$item = strtoupper($item); $item = strtoupper($item);
if(in_array($item,$tol_coins)){ if (in_array($item, $tol_coins)) {
$exchange = ExchangeFactory::createExchange('HuoBi'); $exchange = ExchangeFactory::createExchange('HuoBi');
if ($exchange->symbolExists($item)) { if ($exchange->symbolExists($item)) {
$quotation = $exchange->getTicker($item); $quotation = $exchange->getTicker($item);
if($quotation){ if ($quotation) {
//格式化行情数据 //格式化行情数据
foreach ($quotation as $key => $value) { foreach ($quotation as $key => $value) {
$quotation[$key] = (float)sprintf("%0.4f", (double)$value); $quotation[$key] = (float)sprintf("%0.4f", (double)$value);
...@@ -58,30 +59,34 @@ class ServiceController extends BaseController ...@@ -58,30 +59,34 @@ class ServiceController extends BaseController
$quotation['rmb'] = (float)sprintf("%0.4f", $rate * $quotation['last']); $quotation['rmb'] = (float)sprintf("%0.4f", $rate * $quotation['last']);
} }
} }
}else{ } else {
$quotation = ExchangeBusiness::getquatation($item); $quotation = ExchangeBusiness::getquatation($item);
} }
if (!$quotation) { if (!$quotation) {
//使用Coin服务 //使用Coin服务
try { try {
$coinServer = CoinFactory::createCoin($item, '', ''); $coinServer = CoinFactory::createCoin($item, '', '');
$tickerData[$item]['rmb'] = $coinServer->getPrice(); $tickerData[$item]['rmb'] = $coinServer->getPrice();
$tickerData[$item]['last'] = $coinServer->getDollar(); $tickerData[$item]['last'] = $coinServer->getDollar();
$tickerData[$item]['low'] = $coinServer->getLow(); $tickerData[$item]['low'] = $coinServer->getLow();
$tickerData[$item]['high'] = $coinServer->getHigh(); $tickerData[$item]['high'] = $coinServer->getHigh();
$tickerData[$item]['open'] = $coinServer->getDollar();
$tickerData[$item]['usd'] = $coinServer->getDollar();
$coinServer->__destruct(); $coinServer->__destruct();
} catch (\Exception $exception) { } catch (\Exception $exception) {
$tickerData[$item]['rmb'] = 0; $tickerData[$item]['rmb'] = 0;
$tickerData[$item]['last'] = 0; $tickerData[$item]['last'] = 0;
$tickerData[$item]['low'] = 0; $tickerData[$item]['low'] = 0;
$tickerData[$item]['high'] = 0; $tickerData[$item]['high'] = 0;
$tickerData[$item]['open'] = 0;
$tickerData[$item]['usd'] = 0;
\Yii::error($exception->getMessage()); \Yii::error($exception->getMessage());
} }
}else{ } else {
$tickerData[$item] = $quotation; $tickerData[$item] = $quotation;
} }
} }
return ['code' => 0,'data' => $tickerData,'msg' => '行情获取成功']; return ['code' => 0, 'data' => $tickerData, 'msg' => '行情获取成功'];
} }
} }
...@@ -94,13 +99,13 @@ class ServiceController extends BaseController ...@@ -94,13 +99,13 @@ class ServiceController extends BaseController
$platform_id = Yii::$app->request->get('platform_id', 6); $platform_id = Yii::$app->request->get('platform_id', 6);
$type = Yii::$app->request->get('type', 1); $type = Yii::$app->request->get('type', 1);
$coin_recommendItems = $this->coinRecommendList($platform_id, $type); $coin_recommendItems = $this->coinRecommendList($platform_id, $type);
$fields =['id', 'sid', 'icon', 'name', 'nickname','chain','platform']; $fields = ['id', 'sid', 'icon', 'name', 'nickname', 'chain', 'platform'];
$rows = Coin::getSelectList(1, 999, $fields,[['in','id',$coin_recommendItems]]); $rows = Coin::getSelectList(1, 999, $fields, [['in', 'id', $coin_recommendItems]]);
foreach ($rows['data'] as $key => &$value) { foreach ($rows['data'] as $key => &$value) {
$nickname = json_decode($value['nickname'], true); $nickname = json_decode($value['nickname'], true);
$value['nickname'] = $nickname[$this->lang]; $value['nickname'] = $nickname[$this->lang];
} }
return ['code' => 0,'data' => $rows,'msg' => '币种列表获取成功']; return ['code' => 0, 'data' => $rows, 'msg' => '币种列表获取成功'];
} }
/** /**
...@@ -109,9 +114,9 @@ class ServiceController extends BaseController ...@@ -109,9 +114,9 @@ class ServiceController extends BaseController
*/ */
private function coinRecommendList($platform_id, $type = 1) private function coinRecommendList($platform_id, $type = 1)
{ {
$recommend_list = CoinRecommend::find()->select('cid')->where(['platform_id' => $platform_id ,'type' => $type])->all(); $recommend_list = CoinRecommend::find()->select('cid')->where(['platform_id' => $platform_id, 'type' => $type])->all();
if($recommend_list){ if ($recommend_list) {
$coin_ids = array_column($recommend_list,'cid'); $coin_ids = array_column($recommend_list, 'cid');
return $coin_ids; return $coin_ids;
} }
return []; return [];
...@@ -124,15 +129,15 @@ class ServiceController extends BaseController ...@@ -124,15 +129,15 @@ class ServiceController extends BaseController
public function actionFee() public function actionFee()
{ {
$request = Yii::$app->request; $request = Yii::$app->request;
$coin = $request->post('name'); $coin = $request->post('name');
if(!$coin){ if (!$coin) {
return ['code' => 1,'data' => [],'msg' => '币种不能为空']; return ['code' => 1, 'data' => [], 'msg' => '币种不能为空'];
} }
$fee = MinerFee::find()->where(['platform' => $coin,'type' => 2])->select('id,platform,type,fee,create_at,update_at')->asArray()->one(); $fee = MinerFee::find()->where(['platform' => $coin, 'type' => 2])->select('id,platform,type,fee,create_at,update_at')->asArray()->one();
if(!$fee){ if (!$fee) {
return ['code' => 1,'data' => [],'msg' => '旷工费未设置']; return ['code' => 1, 'data' => [], 'msg' => '旷工费未设置'];
} }
return ['code' => 0,'data' => $fee,'msg' => '旷工费获取成功']; return ['code' => 0, 'data' => $fee, 'msg' => '旷工费获取成功'];
} }
/** /**
...@@ -141,8 +146,8 @@ class ServiceController extends BaseController ...@@ -141,8 +146,8 @@ class ServiceController extends BaseController
*/ */
private function getRate() private function getRate()
{ {
$exchange = ExchangeFactory::createExchange("Bty"); $exchange = ExchangeFactory::createExchange("Bty");
$rate = $exchange->getTicker("BTY", "USDT"); $rate = $exchange->getTicker("BTY", "USDT");
return (float)$rate['rmb'] / $rate['last']; return (float)$rate['rmb'] / $rate['last'];
} }
...@@ -153,12 +158,12 @@ class ServiceController extends BaseController ...@@ -153,12 +158,12 @@ class ServiceController extends BaseController
public function actionChain() public function actionChain()
{ {
$request = Yii::$app->request; $request = Yii::$app->request;
$currency = $request->post('currency',''); $currency = $request->post('currency', '');
$coin = Coin::find()->where(['name' => $currency])->select('name,nickname,chain')->asArray()->one(); $coin = Coin::find()->where(['name' => $currency])->select('name,nickname,chain')->asArray()->one();
if($coin){ if ($coin) {
return ['code' => 0,'data' => $coin]; return ['code' => 0, 'data' => $coin];
} }
return ['code' => -1,'msg' => '币种不存在']; return ['code' => -1, 'msg' => '币种不存在'];
} }
} }
...@@ -92,7 +92,7 @@ class CoinController extends BaseController ...@@ -92,7 +92,7 @@ class CoinController extends BaseController
if (isset($data['optional_name'])) { if (isset($data['optional_name'])) {
$data['optional_name'] = strtoupper($data['optional_name']); $data['optional_name'] = strtoupper($data['optional_name']);
} }
$data['name'] = strtoupper($data['name']); $data['name'] = strtoupper(trim($data['name']));
$data['platform'] = strtolower($data['platform']); $data['platform'] = strtolower($data['platform']);
$data['chain'] = strtoupper($data['chain']); $data['chain'] = strtoupper($data['chain']);
$lang = [ $lang = [
...@@ -105,7 +105,7 @@ class CoinController extends BaseController ...@@ -105,7 +105,7 @@ class CoinController extends BaseController
$nickname = []; $nickname = [];
$introduce = []; $introduce = [];
foreach ($nickname_arr as $key => $val) { foreach ($nickname_arr as $key => $val) {
$nickname[$lang[$key]] = $val; $nickname[$lang[$key]] = trim($val);
} }
foreach ($introduce_arr as $key => $val) { foreach ($introduce_arr as $key => $val) {
$introduce[$lang[$key]] = $val; $introduce[$lang[$key]] = $val;
......
...@@ -8,612 +8,656 @@ use yii\helpers\Json; ...@@ -8,612 +8,656 @@ use yii\helpers\Json;
class Curl class Curl
{ {
/** /**
* @var string * @var string
* * Holds response data right after sending a request. * * Holds response data right after sending a request.
*/ */
public $httpType = 'http'; public $httpType = 'http';
/** /**
* @var string|boolean * @var string|boolean
* Holds response data right after sending a request. * Holds response data right after sending a request.
*/ */
public $response = null; public $response = null;
/** /**
* @var null|integer * @var null|integer
* Error code holder: https://curl.haxx.se/libcurl/c/libcurl-errors.html * Error code holder: https://curl.haxx.se/libcurl/c/libcurl-errors.html
*/ */
public $errorCode = null; public $errorCode = null;
/** /**
* @var null|string * @var null|string
* Error text holder: http://php.net/manual/en/function.curl-strerror.php * Error text holder: http://php.net/manual/en/function.curl-strerror.php
*/ */
public $errorText = null; public $errorText = null;
/** /**
* @var integer HTTP-Status Code * @var integer HTTP-Status Code
* This value will hold HTTP-Status Code. False if request was not successful. * This value will hold HTTP-Status Code. False if request was not successful.
*/ */
public $responseCode = null; public $responseCode = null;
/** /**
* @var string|null HTTP Response Charset * @var string|null HTTP Response Charset
* (taken from Content-type header) * (taken from Content-type header)
*/ */
public $responseCharset = null; public $responseCharset = null;
/** /**
* @var int HTTP Response Length * @var int HTTP Response Length
* (taken from Content-length header, or strlen() of downloaded content) * (taken from Content-length header, or strlen() of downloaded content)
*/ */
public $responseLength = -1; public $responseLength = -1;
/** /**
* @var string|null HTTP Response Content Type * @var string|null HTTP Response Content Type
* (taken from Content-type header) * (taken from Content-type header)
*/ */
public $responseType = null; public $responseType = null;
/** /**
* @var array|null HTTP Response headers * @var array|null HTTP Response headers
* Lists response header in an array if CURLOPT_HEADER is set to true. * Lists response header in an array if CURLOPT_HEADER is set to true.
*/ */
public $responseHeaders = null; public $responseHeaders = null;
/** /**
* @var array HTTP-Status Code * @var array HTTP-Status Code
* Custom options holder * Custom options holder
*/ */
protected $_options = []; protected $_options = [];
/** /**
* @var array * @var array
* Hold array of get params to send with the request * Hold array of get params to send with the request
*/ */
protected $_getParams = []; protected $_getParams = [];
/** /**
* @var array * @var array
* Hold array of post params to send with the request * Hold array of post params to send with the request
*/ */
protected $_postParams = []; protected $_postParams = [];
/** /**
* @var resource|null * @var resource|null
* Holds cURL-Handler * Holds cURL-Handler
*/ */
public $curl = null; public $curl = null;
/** /**
* @var string * @var string
* hold base URL * hold base URL
*/ */
protected $_baseUrl = ''; protected $_baseUrl = '';
/** /**
* @var array default curl options * @var array default curl options
* Default curl options * Default curl options
*/ */
protected $_defaultOptions = [ protected $_defaultOptions = [
CURLOPT_USERAGENT => 'Yii2-Curl-Agent', CURLOPT_USERAGENT => 'Yii2-Curl-Agent',
CURLOPT_TIMEOUT => 10, CURLOPT_TIMEOUT => 10,
CURLOPT_CONNECTTIMEOUT => 10, CURLOPT_CONNECTTIMEOUT => 10,
CURLOPT_RETURNTRANSFER => true, CURLOPT_RETURNTRANSFER => true,
CURLOPT_HEADER => true, CURLOPT_HEADER => true,
CURLOPT_SSL_VERIFYPEER => false, CURLOPT_SSL_VERIFYPEER => false,
CURLOPT_SSL_VERIFYHOST => 2, CURLOPT_SSL_VERIFYHOST => 2,
]; ];
// ############################################### class methods // ############################################## // ############################################### class methods // ##############################################
/** /**
* Start performing GET-HTTP-Request * Start performing GET-HTTP-Request
* *
* @param string $url * @param string $url
* @param boolean $raw if response body contains JSON and should be decoded * @param boolean $raw if response body contains JSON and should be decoded
* *
* @return mixed response * @return mixed response
*/ */
public function get($url, $raw = true) protected $connect_timeout_ms;
{ protected $timeout_ms;
$this->_baseUrl = $url;
return $this->_httpRequest('GET', $raw); public function __construct($config = [])
} {
/** if (!empty($config)) {
* Start performing HEAD-HTTP-Request $this->connect_timeout_ms = isset($config['connect_timeout']) ? $config['connect_timeout'] : 10;
* $this->timeout_ms = isset($config['timeout_ms']) ? $config['timeout_ms'] : 100;
* @param string $url }
* }
* @return mixed response
*/
public function head($url) public function get($url, $raw = true)
{ {
$this->_baseUrl = $url; $this->_baseUrl = $url;
return $this->_httpRequest('HEAD'); return $this->_httpRequest('GET', $raw);
} }
/**
* Start performing POST-HTTP-Request /**
* * Start performing HEAD-HTTP-Request
* @param string $url *
* @param boolean $raw if response body contains JSON and should be decoded * @param string $url
* *
* @return mixed response * @return mixed response
*/ */
public function post($url, $raw = true) public function head($url)
{ {
$this->_baseUrl = $url; $this->_baseUrl = $url;
return $this->_httpRequest('POST', $raw); return $this->_httpRequest('HEAD');
} }
/**
* Start performing PUT-HTTP-Request /**
* * Start performing POST-HTTP-Request
* @param string $url *
* @param boolean $raw if response body contains JSON and should be decoded * @param string $url
* * @param boolean $raw if response body contains JSON and should be decoded
* @return mixed response *
*/ * @return mixed response
public function put($url, $raw = true) */
{ public function post($url, $raw = true)
$this->_baseUrl = $url; {
return $this->_httpRequest('PUT', $raw); $this->_baseUrl = $url;
} return $this->_httpRequest('POST', $raw);
/** }
* Start performing PATCH-HTTP-Request
* /**
* @param string $url * Start performing PUT-HTTP-Request
* @param boolean $raw if response body contains JSON and should be decoded *
* * @param string $url
* @return mixed response * @param boolean $raw if response body contains JSON and should be decoded
*/ *
public function patch($url, $raw = true) * @return mixed response
{ */
$this->_baseUrl = $url; public function put($url, $raw = true)
$this->setHeaders([ {
'X-HTTP-Method-Override' => 'PATCH' $this->_baseUrl = $url;
]); return $this->_httpRequest('PUT', $raw);
return $this->_httpRequest('POST',$raw); }
}
/** /**
* Start performing DELETE-HTTP-Request * Start performing PATCH-HTTP-Request
* *
* @param string $url * @param string $url
* @param boolean $raw if response body contains JSON and should be decoded * @param boolean $raw if response body contains JSON and should be decoded
* *
* @return mixed response * @return mixed response
*/ */
public function delete($url, $raw = true) public function patch($url, $raw = true)
{ {
$this->_baseUrl = $url; $this->_baseUrl = $url;
return $this->_httpRequest('DELETE', $raw); $this->setHeaders([
} 'X-HTTP-Method-Override' => 'PATCH'
/** ]);
* Set curl option return $this->_httpRequest('POST', $raw);
* }
* @param string $key
* @param mixed $value /**
* * Start performing DELETE-HTTP-Request
* @return $this *
*/ * @param string $url
public function setOption($key, $value) * @param boolean $raw if response body contains JSON and should be decoded
{ *
//set value * @return mixed response
if (array_key_exists($key, $this->_defaultOptions) && $key !== CURLOPT_WRITEFUNCTION) { */
$this->_defaultOptions[$key] = $value; public function delete($url, $raw = true)
} else { {
$this->_options[$key] = $value; $this->_baseUrl = $url;
} return $this->_httpRequest('DELETE', $raw);
//return self }
return $this;
} /**
/** * Set curl option
* Set get params *
* * @param string $key
* @param array $params * @param mixed $value
* @return $this *
*/ * @return $this
public function setGetParams($params) */
{ public function setOption($key, $value)
if (is_array($params)) { {
foreach ($params as $key => $value) { //set value
$this->_getParams[$key] = $value; if (array_key_exists($key, $this->_defaultOptions) && $key !== CURLOPT_WRITEFUNCTION) {
} $this->_defaultOptions[$key] = $value;
} } else {
//return self $this->_options[$key] = $value;
return $this; }
} //return self
/** return $this;
* Set get params }
*
* @param array $params /**
* @return $this * Set get params
*/ *
public function setPostParams($params) * @param array $params
{ * @return $this
if (is_array($params)) { */
$this->setOption( public function setGetParams($params)
CURLOPT_POSTFIELDS, {
http_build_query($params) if (is_array($params)) {
); foreach ($params as $key => $value) {
} $this->_getParams[$key] = $value;
//return self }
return $this; }
} //return self
/** return $this;
* Set raw post data allows you to post any data format. }
*
* @param mixed $data /**
* @return $this * Set get params
*/ *
public function setRawPostData($data) * @param array $params
{ * @return $this
$this->setOption( */
CURLOPT_POSTFIELDS, public function setPostParams($params)
$data {
); if (is_array($params)) {
//return self $this->setOption(
return $this; CURLOPT_POSTFIELDS,
} http_build_query($params)
/** );
* Set get params }
* //return self
* @param string $data return $this;
* @return $this }
*/
public function setRequestBody($data) /**
{ * Set raw post data allows you to post any data format.
if (is_string($data)) { *
$this->setOption( * @param mixed $data
CURLOPT_POSTFIELDS, * @return $this
$data */
); public function setRawPostData($data)
} {
//return self $this->setOption(
return $this; CURLOPT_POSTFIELDS,
} $data
/** );
* Get URL - return URL parsed with given params //return self
* return $this;
* @return string The full URL with parsed get params }
*/
public function getUrl() /**
{ * Set get params
if (Count($this->_getParams) > 0) { *
return $this->_baseUrl.'?'.http_build_query($this->_getParams); * @param string $data
} else { * @return $this
return $this->_baseUrl; */
} public function setRequestBody($data)
} {
/** if (is_string($data)) {
* Set curl options $this->setOption(
* CURLOPT_POSTFIELDS,
* @param array $options $data
* );
* @return $this }
*/ //return self
public function setOptions($options) return $this;
{ }
$this->_options = $options + $this->_options;
return $this; /**
} * Get URL - return URL parsed with given params
/** *
* Set multiple headers for request. * @return string The full URL with parsed get params
* */
* @param array $headers public function getUrl()
* {
* @return $this if (Count($this->_getParams) > 0) {
*/ return $this->_baseUrl . '?' . http_build_query($this->_getParams);
public function setHeaders($headers) } else {
{ return $this->_baseUrl;
if (is_array($headers)) { }
//init }
$parsedHeader = [];
//collect currently set headers /**
foreach ($this->getRequestHeaders() as $header => $value) { * Set curl options
array_push($parsedHeader, $header.':'.$value); *
} * @param array $options
//parse header into right format key:value *
foreach ($headers as $header => $value) { * @return $this
array_push($parsedHeader, $header.':'.$value); */
} public function setOptions($options)
//set headers {
$this->setOption( $this->_options = $options + $this->_options;
CURLOPT_HTTPHEADER, return $this;
$parsedHeader }
);
} /**
return $this; * Set multiple headers for request.
} *
/** * @param array $headers
* Set a single header for request. *
* * @return $this
* @param string $header */
* @param string $value public function setHeaders($headers)
* {
* @return $this if (is_array($headers)) {
*/ //init
public function setHeader($header, $value) $parsedHeader = [];
{ //collect currently set headers
//init foreach ($this->getRequestHeaders() as $header => $value) {
$parsedHeader = []; array_push($parsedHeader, $header . ':' . $value);
//collect currently set headers }
foreach ($this->getRequestHeaders() as $headerToSet => $valueToSet) { //parse header into right format key:value
array_push($parsedHeader, $headerToSet.':'.$valueToSet); foreach ($headers as $header => $value) {
} array_push($parsedHeader, $header . ':' . $value);
//add override new header }
if (strlen($header) > 0) { //set headers
array_push($parsedHeader, $header.':'.$value); $this->setOption(
} CURLOPT_HTTPHEADER,
//set headers $parsedHeader
$this->setOption( );
CURLOPT_HTTPHEADER, }
$parsedHeader return $this;
); }
return $this;
} /**
/** * Set a single header for request.
* Unset a single header. *
* * @param string $header
* @param string $header * @param string $value
* *
* @return $this * @return $this
*/ */
public function unsetHeader($header) public function setHeader($header, $value)
{ {
//init //init
$parsedHeader = []; $parsedHeader = [];
//collect currently set headers and filter "unset" header param. //collect currently set headers
foreach ($this->getRequestHeaders() as $headerToSet => $valueToSet) { foreach ($this->getRequestHeaders() as $headerToSet => $valueToSet) {
if ($header !== $headerToSet) { array_push($parsedHeader, $headerToSet . ':' . $valueToSet);
array_push($parsedHeader, $headerToSet.':'.$valueToSet); }
} //add override new header
} if (strlen($header) > 0) {
//set headers array_push($parsedHeader, $header . ':' . $value);
$this->setOption( }
CURLOPT_HTTPHEADER, //set headers
$parsedHeader $this->setOption(
); CURLOPT_HTTPHEADER,
return $this; $parsedHeader
} );
/** return $this;
* Get all request headers as key:value array }
*
* @return array /**
*/ * Unset a single header.
public function getRequestHeaders() *
{ * @param string $header
//Init *
$requestHeaders = $this->getOption(CURLOPT_HTTPHEADER); * @return $this
$parsedRequestHeaders = []; */
if (is_array($requestHeaders)) { public function unsetHeader($header)
foreach ($requestHeaders as $headerValue) { {
list ($key, $value) = explode(':', $headerValue, 2); //init
$parsedRequestHeaders[$key] = $value; $parsedHeader = [];
} //collect currently set headers and filter "unset" header param.
} foreach ($this->getRequestHeaders() as $headerToSet => $valueToSet) {
return $parsedRequestHeaders; if ($header !== $headerToSet) {
} array_push($parsedHeader, $headerToSet . ':' . $valueToSet);
/** }
* Get specific request header as key:value array }
* //set headers
* @param string $headerKey $this->setOption(
* CURLOPT_HTTPHEADER,
* @return string|null $parsedHeader
*/ );
public function getRequestHeader($headerKey) return $this;
{ }
//Init
$parsedRequestHeaders = $this->getRequestHeaders(); /**
return isset($parsedRequestHeaders[$headerKey]) ? $parsedRequestHeaders[$headerKey] : null; * Get all request headers as key:value array
} *
/** * @return array
* Unset a single curl option */
* public function getRequestHeaders()
* @param string $key {
* //Init
* @return $this $requestHeaders = $this->getOption(CURLOPT_HTTPHEADER);
*/ $parsedRequestHeaders = [];
public function unsetOption($key) if (is_array($requestHeaders)) {
{ foreach ($requestHeaders as $headerValue) {
//reset a single option if its set already list ($key, $value) = explode(':', $headerValue, 2);
if (isset($this->_options[$key])) { $parsedRequestHeaders[$key] = $value;
unset($this->_options[$key]); }
} }
return $this; return $parsedRequestHeaders;
} }
/**
* Unset all curl option, excluding default options. /**
* * Get specific request header as key:value array
* @return $this *
*/ * @param string $headerKey
public function unsetOptions() *
{ * @return string|null
//reset all options */
if (isset($this->_options)) { public function getRequestHeader($headerKey)
$this->_options = []; {
} //Init
return $this; $parsedRequestHeaders = $this->getRequestHeaders();
} return isset($parsedRequestHeaders[$headerKey]) ? $parsedRequestHeaders[$headerKey] : null;
/** }
* Total reset of options, responses, etc.
* /**
* @return $this * Unset a single curl option
*/ *
public function reset() * @param string $key
{ *
if ($this->curl !== null) { * @return $this
curl_close($this->curl); //stop curl */
} public function unsetOption($key)
//reset all options {
if (isset($this->_options)) { //reset a single option if its set already
$this->_options = []; if (isset($this->_options[$key])) {
} unset($this->_options[$key]);
//reset response & status params }
$this->curl = null; return $this;
$this->errorCode = null; }
$this->response = null;
$this->responseCode = null; /**
$this->responseCharset = null; * Unset all curl option, excluding default options.
$this->responseLength = -1; *
$this->responseType = null; * @return $this
$this->errorText = null; */
$this->_postParams = []; public function unsetOptions()
$this->_getParams = []; {
return $this; //reset all options
} if (isset($this->_options)) {
/** $this->_options = [];
* Return a single option }
* return $this;
* @param string|integer $key }
* @return mixed|boolean
*/ /**
public function getOption($key) * Total reset of options, responses, etc.
{ *
//get merged options depends on default and user options * @return $this
$mergesOptions = $this->getOptions(); */
//return value or false if key is not set. public function reset()
return isset($mergesOptions[$key]) ? $mergesOptions[$key] : false; {
} if ($this->curl !== null) {
/** curl_close($this->curl); //stop curl
* Return merged curl options and keep keys! }
* //reset all options
* @return array if (isset($this->_options)) {
*/ $this->_options = [];
public function getOptions() }
{ //reset response & status params
return $this->_options + $this->_defaultOptions; $this->curl = null;
} $this->errorCode = null;
/** $this->response = null;
* Get curl info according to http://php.net/manual/de/function.curl-getinfo.php $this->responseCode = null;
* $this->responseCharset = null;
* @param null $opt $this->responseLength = -1;
* @return array|mixed $this->responseType = null;
*/ $this->errorText = null;
public function getInfo($opt = null) $this->_postParams = [];
{ $this->_getParams = [];
if ($this->curl !== null && $opt === null) { return $this;
return curl_getinfo($this->curl); }
} elseif ($this->curl !== null && $opt !== null) {
return curl_getinfo($this->curl, $opt); /**
} else { * Return a single option
return []; *
} * @param string|integer $key
} * @return mixed|boolean
/** */
* Performs HTTP request public function getOption($key)
* {
* @param string $method //get merged options depends on default and user options
* @param boolean $raw if response body contains JSON and should be decoded -> helper. $mergesOptions = $this->getOptions();
* //return value or false if key is not set.
* @throws Exception if request failed return isset($mergesOptions[$key]) ? $mergesOptions[$key] : false;
* }
* @return mixed
*/ /**
protected function _httpRequest($method, $raw = false) * Return merged curl options and keep keys!
{ *
//set request type and writer function * @return array
$this->setOption(CURLOPT_CUSTOMREQUEST, strtoupper($method)); */
//check if method is head and set no body public function getOptions()
if ($method === 'HEAD') { {
$this->setOption(CURLOPT_NOBODY, true); return $this->_options + $this->_defaultOptions;
$this->unsetOption(CURLOPT_WRITEFUNCTION); }
}
//setup error reporting and profiling /**
if (YII_DEBUG) { * Get curl info according to http://php.net/manual/de/function.curl-getinfo.php
Yii::trace('Start sending cURL-Request: '.$this->getUrl().'\n', __METHOD__); *
Yii::beginProfile($method.' '.$this->_baseUrl.'#'.md5(serialize($this->getOption(CURLOPT_POSTFIELDS))), __METHOD__); * @param null $opt
} * @return array|mixed
/** */
* proceed curl public function getInfo($opt = null)
*/ {
$curlOptions = $this->getOptions(); if ($this->curl !== null && $opt === null) {
$this->curl = curl_init($this->getUrl()); return curl_getinfo($this->curl);
curl_setopt_array($this->curl, $curlOptions); } elseif ($this->curl !== null && $opt !== null) {
curl_setopt($this->curl, CURLOPT_TIMEOUT,40); return curl_getinfo($this->curl, $opt);
$response = curl_exec($this->curl); } else {
//check if curl was successful return [];
if ($response === false) { }
//set error code }
$this->errorCode = curl_errno($this->curl);
$this->errorText = curl_strerror($this->errorCode); /**
switch ($this->errorCode) { * Performs HTTP request
// 7, 28 = timeout *
case 7: * @param string $method
case 28: * @param boolean $raw if response body contains JSON and should be decoded -> helper.
$this->responseCode = 'timeout'; *
return false; * @throws Exception if request failed
break; *
default: * @return mixed
return false; */
break; protected function _httpRequest($method, $raw = false)
} {
} //set request type and writer function
//extract header / body data if CURLOPT_HEADER are set to true $this->setOption(CURLOPT_CUSTOMREQUEST, strtoupper($method));
if (isset($curlOptions[CURLOPT_HEADER]) && $curlOptions[CURLOPT_HEADER]) { //check if method is head and set no body
$this->response = $this->_extractCurlBody($response); if ($method === 'HEAD') {
$this->responseHeaders = $this->_extractCurlHeaders($response); $this->setOption(CURLOPT_NOBODY, true);
} else { $this->unsetOption(CURLOPT_WRITEFUNCTION);
$this->response = $response; }
} //setup error reporting and profiling
// Extract additional curl params if (YII_DEBUG) {
$this->_extractAdditionalCurlParameter(); Yii::trace('Start sending cURL-Request: ' . $this->getUrl() . '\n', __METHOD__);
//end yii debug profile Yii::beginProfile($method . ' ' . $this->_baseUrl . '#' . md5(serialize($this->getOption(CURLOPT_POSTFIELDS))), __METHOD__);
if (YII_DEBUG) { }
Yii::endProfile($method.' '.$this->getUrl().'#'.md5(serialize($this->getOption(CURLOPT_POSTFIELDS))), __METHOD__); /**
} * proceed curl
//check responseCode and return data/status */
if ($this->getOption(CURLOPT_CUSTOMREQUEST) === 'HEAD') { $curlOptions = $this->getOptions();
return true; $this->curl = curl_init($this->getUrl());
} else { curl_setopt_array($this->curl, $curlOptions);
$this->response = $raw ? $this->response : Json::decode($this->response); if (true == $this->timeout_ms && true == $this->connect_timeout_ms) {
return $this->response; curl_setopt($this->curl, CURLOPT_TIMEOUT_MS, $this->timeout_ms);
} curl_setopt($this->curl, CURLOPT_CONNECTTIMEOUT, $this->timeout_ms);
} curl_setopt($this->curl, CURLOPT_CONNECTTIMEOUT_MS, $this->connect_timeout_ms);
/** }
* Extract additional curl params protected class helper //curl_setopt($this->curl, CURLOPT_TIMEOUT,40);
*/ $response = curl_exec($this->curl);
protected function _extractAdditionalCurlParameter () //check if curl was successful
{ if ($response === false) {
/** //set error code
* retrieve response code $this->errorCode = curl_errno($this->curl);
*/ $this->errorText = curl_strerror($this->errorCode);
$this->responseCode = curl_getinfo($this->curl, CURLINFO_HTTP_CODE); switch ($this->errorCode) {
/** // 7, 28 = timeout
* try extract response type & charset. case 7:
*/ case 28:
$this->responseType = curl_getinfo($this->curl, CURLINFO_CONTENT_TYPE); $this->responseCode = 'timeout';
if (!is_null($this->responseType) && count(explode(';', $this->responseType)) > 1) { return false;
list($this->responseType, $possibleCharset) = explode(';', $this->responseType); break;
//extract charset default:
if (preg_match('~^charset=(.+?)$~', trim($possibleCharset), $matches) && isset($matches[1])) { return false;
$this->responseCharset = strtolower($matches[1]); break;
} }
} }
/** //extract header / body data if CURLOPT_HEADER are set to true
* try extract response length if (isset($curlOptions[CURLOPT_HEADER]) && $curlOptions[CURLOPT_HEADER]) {
*/ $this->response = $this->_extractCurlBody($response);
$this->responseLength = curl_getinfo($this->curl, CURLINFO_CONTENT_LENGTH_DOWNLOAD); $this->responseHeaders = $this->_extractCurlHeaders($response);
if((int)$this->responseLength == -1) { } else {
$this->responseLength = strlen($this->response); $this->response = $response;
} }
} // Extract additional curl params
/** $this->_extractAdditionalCurlParameter();
* Extract body curl data from response //end yii debug profile
* if (YII_DEBUG) {
* @param string $response Yii::endProfile($method . ' ' . $this->getUrl() . '#' . md5(serialize($this->getOption(CURLOPT_POSTFIELDS))), __METHOD__);
* @return string }
*/ //check responseCode and return data/status
protected function _extractCurlBody ($response) if ($this->getOption(CURLOPT_CUSTOMREQUEST) === 'HEAD') {
{ return true;
return substr($response, $this->getInfo(CURLINFO_HEADER_SIZE)); } else {
} $this->response = $raw ? $this->response : Json::decode($this->response);
/** return $this->response;
* Extract header curl data from response }
* }
* @param string $response
* @return array /**
*/ * Extract additional curl params protected class helper
protected function _extractCurlHeaders ($response) */
{ protected function _extractAdditionalCurlParameter()
//Init {
$headers = []; /**
$headerText = substr($response, 0, strpos($response, "\r\n\r\n")); * retrieve response code
foreach (explode("\r\n", $headerText) as $i => $line) { */
if ($i === 0) { $this->responseCode = curl_getinfo($this->curl, CURLINFO_HTTP_CODE);
$headers['http_code'] = $line; /**
} else { * try extract response type & charset.
list ($key, $value) = explode(':', $line, 2); */
$headers[$key] = ltrim($value); $this->responseType = curl_getinfo($this->curl, CURLINFO_CONTENT_TYPE);
} if (!is_null($this->responseType) && count(explode(';', $this->responseType)) > 1) {
} list($this->responseType, $possibleCharset) = explode(';', $this->responseType);
return $headers; //extract charset
} if (preg_match('~^charset=(.+?)$~', trim($possibleCharset), $matches) && isset($matches[1])) {
$this->responseCharset = strtolower($matches[1]);
}
}
/**
* try extract response length
*/
$this->responseLength = curl_getinfo($this->curl, CURLINFO_CONTENT_LENGTH_DOWNLOAD);
if ((int)$this->responseLength == -1) {
$this->responseLength = strlen($this->response);
}
}
/**
* Extract body curl data from response
*
* @param string $response
* @return string
*/
protected function _extractCurlBody($response)
{
return substr($response, $this->getInfo(CURLINFO_HEADER_SIZE));
}
/**
* Extract header curl data from response
*
* @param string $response
* @return array
*/
protected function _extractCurlHeaders($response)
{
//Init
$headers = [];
$headerText = substr($response, 0, strpos($response, "\r\n\r\n"));
foreach (explode("\r\n", $headerText) as $i => $line) {
if ($i === 0) {
$headers['http_code'] = $line;
} else {
list ($key, $value) = explode(':', $line, 2);
$headers[$key] = ltrim($value);
}
}
return $headers;
}
} }
\ No newline at end of file
...@@ -10,6 +10,9 @@ class CoinCrossChain extends BaseActiveRecord ...@@ -10,6 +10,9 @@ class CoinCrossChain extends BaseActiveRecord
const WITHDRAW = 0; const WITHDRAW = 0;
const RECHARGE = 1; const RECHARGE = 1;
const CROSS_CHAIN_TRANSFERING = 'cross_chain_transfering';
const CROSS_CHAIN_CACHE_FAIL = 'cross_chain_fail';
public static function getDb() public static function getDb()
{ {
return Yii::$app->get('p_sources'); return Yii::$app->get('p_sources');
...@@ -28,14 +31,14 @@ class CoinCrossChain extends BaseActiveRecord ...@@ -28,14 +31,14 @@ class CoinCrossChain extends BaseActiveRecord
{ {
return [ return [
[['is_with_draw', 'address', 'txhex', 'transfer_url'], 'required'], [['is_with_draw', 'address', 'txhex', 'transfer_url'], 'required'],
['transfer_number', 'safe'] [['transfer_number', 'amount', 'step', 'send_result', 'query_result', 'msg'], 'safe']
]; ];
} }
public function scenarios() public function scenarios()
{ {
$scenarios = [ $scenarios = [
self:: SCENARIOS_CREATE => ['is_with_draw', 'address', 'txhex', 'transfer_url', 'transfer_number'], self:: SCENARIOS_CREATE => ['is_with_draw', 'address', 'txhex', 'transfer_url', 'transfer_number', 'amount', 'step', 'send_result', 'query_result', 'msg'],
]; ];
return array_merge(parent:: scenarios(), $scenarios); return array_merge(parent:: scenarios(), $scenarios);
} }
......
...@@ -20,7 +20,7 @@ class Chain33Service ...@@ -20,7 +20,7 @@ class Chain33Service
public function __construct($parameter = []) public function __construct($parameter = [])
{ {
if(empty($parameter)){ if (empty($parameter)) {
$this->node_params = Yii::$app->params['chain33']; $this->node_params = Yii::$app->params['chain33'];
} else { } else {
$this->node_params = $parameter; $this->node_params = $parameter;
...@@ -31,8 +31,8 @@ class Chain33Service ...@@ -31,8 +31,8 @@ class Chain33Service
{ {
$config = $this->node_params; $config = $this->node_params;
$scheme = $config['scheme'] ?? 'http'; $scheme = $config['scheme'] ?? 'http';
$host = $config['host'] ?? '127.0.0.1'; $host = $config['host'] ?? '127.0.0.1';
$port = (string)$config['port'] ?? ''; $port = (string)$config['port'] ?? '';
if ($port) { if ($port) {
return $scheme . '://' . $host . ':' . $port; return $scheme . '://' . $host . ':' . $port;
} else { } else {
...@@ -44,9 +44,9 @@ class Chain33Service ...@@ -44,9 +44,9 @@ class Chain33Service
{ {
$data = [ $data = [
'jsonrpc' => '2.0', 'jsonrpc' => '2.0',
'id' => 0, 'id' => 0,
'method' => $method, 'method' => $method,
'params' => [], 'params' => [],
]; ];
if (!empty($params)) { if (!empty($params)) {
$data['params'][] = $params; $data['params'][] = $params;
...@@ -56,7 +56,11 @@ class Chain33Service ...@@ -56,7 +56,11 @@ class Chain33Service
public function send($params = [], $method = 'Chain33.Query') public function send($params = [], $method = 'Chain33.Query')
{ {
$ch = new Curl(); $timeout = [
'connect_timeout' => 50000,
'timeout_ms' => 40000
];
$ch = new Curl($timeout);
$jsonrpc = self::jsonRpcBuild($params, $method); $jsonrpc = self::jsonRpcBuild($params, $method);
$ch->setHeader('Content-Type', 'application/json'); $ch->setHeader('Content-Type', 'application/json');
$ch->setRawPostData($jsonrpc); $ch->setRawPostData($jsonrpc);
...@@ -124,7 +128,7 @@ class Chain33Service ...@@ -124,7 +128,7 @@ class Chain33Service
* 获取地址下的所有token资产 * 获取地址下的所有token资产
* *
* @param string|array $address * @param string|array $address
* @param string $symbol * @param string $symbol
* @return array * @return array
*/ */
public function getAccountTokenAssets($address, $symbol) public function getAccountTokenAssets($address, $symbol)
...@@ -133,8 +137,8 @@ class Chain33Service ...@@ -133,8 +137,8 @@ class Chain33Service
$address = [$address]; $address = [$address];
} }
$params = [ $params = [
"addresses" => $address, "addresses" => $address,
"execer" => "user.p.guodun.token", "execer" => "user.p.guodun.token",
"tokenSymbol" => $symbol "tokenSymbol" => $symbol
]; ];
return $this->send($params, 'token.GetTokenBalance'); return $this->send($params, 'token.GetTokenBalance');
...@@ -147,18 +151,18 @@ class Chain33Service ...@@ -147,18 +151,18 @@ class Chain33Service
* @param $to * @param $to
* @param $amount * @param $amount
* @param string $note * @param string $note
* @param bool $isToken * @param bool $isToken
* @param string $tokenSymbol * @param string $tokenSymbol
* @return array * @return array
*/ */
public function extractToken($from, $to, $amount, $note = '', $isToken = true, $tokenSymbol = '') public function extractToken($from, $to, $amount, $note = '', $isToken = true, $tokenSymbol = '')
{ {
$params = [ $params = [
"from" => $to, "from" => $to,
"to" => $from, "to" => $from,
"amount" => -$amount, "amount" => -$amount,
"note" => $note, "note" => $note,
"isToken" => $isToken ? true : false, "isToken" => $isToken ? true : false,
"tokenSymbol" => strtoupper($tokenSymbol) "tokenSymbol" => strtoupper($tokenSymbol)
]; ];
return $this->send($params, 'Chain33.SendToAddress'); return $this->send($params, 'Chain33.SendToAddress');
...@@ -171,18 +175,18 @@ class Chain33Service ...@@ -171,18 +175,18 @@ class Chain33Service
* @param $to * @param $to
* @param $amount * @param $amount
* @param string $note * @param string $note
* @param bool $isToken * @param bool $isToken
* @param string $tokenSymbol * @param string $tokenSymbol
* @return array * @return array
*/ */
public function transToken($from, $to, $amount, $note = '', $isToken = true, $tokenSymbol = '') public function transToken($from, $to, $amount, $note = '', $isToken = true, $tokenSymbol = '')
{ {
$params = [ $params = [
"from" => $from, "from" => $from,
"to" => $to, "to" => $to,
"amount" => $amount, "amount" => $amount,
"note" => $note, "note" => $note,
"isToken" => $isToken ? true : false, "isToken" => $isToken ? true : false,
"tokenSymbol" => strtoupper($tokenSymbol) "tokenSymbol" => strtoupper($tokenSymbol)
]; ];
return $this->send($params, 'Chain33.SendToAddress'); return $this->send($params, 'Chain33.SendToAddress');
...@@ -191,25 +195,25 @@ class Chain33Service ...@@ -191,25 +195,25 @@ class Chain33Service
public function createTokenRawTransaction($to, $amount, $isToken, $tokenSymbol, $fee, $note, $execer) public function createTokenRawTransaction($to, $amount, $isToken, $tokenSymbol, $fee, $note, $execer)
{ {
$params = [ $params = [
"to" => $to, "to" => $to,
"amount" => $amount, "amount" => $amount,
"isToken" => $isToken, "isToken" => $isToken,
"tokenSymbol" => $tokenSymbol, "tokenSymbol" => $tokenSymbol,
"fee" => $fee, "fee" => $fee,
"note" => $note, "note" => $note,
"execer" => $execer, "execer" => $execer,
]; ];
return $this->send($params, 'Chain33.CreateRawTransaction'); return $this->send($params, 'Chain33.CreateRawTransaction');
} }
public function createRawTransaction($to, $amount, $fee, $note,$execer) public function createRawTransaction($to, $amount, $fee, $note, $execer)
{ {
$params = [ $params = [
"to" => $to, "to" => $to,
"amount" => $amount, "amount" => $amount,
"fee" => $fee, "fee" => $fee,
"note" => $note, "note" => $note,
"execer" => $execer, "execer" => $execer,
]; ];
...@@ -274,11 +278,11 @@ class Chain33Service ...@@ -274,11 +278,11 @@ class Chain33Service
public function structureTrade($amount, $execName, $fee, $isToken = True, $to, $tokenSymbol = '') public function structureTrade($amount, $execName, $fee, $isToken = True, $to, $tokenSymbol = '')
{ {
$params = [ $params = [
"amount" => $amount, "amount" => $amount,
"execName" => $execName, "execName" => $execName,
"fee" => $fee, "fee" => $fee,
"isToken" => $isToken ? true : false, "isToken" => $isToken ? true : false,
"to" => $to, "to" => $to,
"tokenSymbol" => strtoupper($tokenSymbol) "tokenSymbol" => strtoupper($tokenSymbol)
]; ];
return $this->send($params, 'Chain33.CreateRawTransaction'); return $this->send($params, 'Chain33.CreateRawTransaction');
...@@ -287,21 +291,38 @@ class Chain33Service ...@@ -287,21 +291,38 @@ class Chain33Service
public function signTrade($addr, $expire = '2h', $txHex) public function signTrade($addr, $expire = '2h', $txHex)
{ {
$params = [ $params = [
"addr" => $addr, "addr" => $addr,
"expire" => $expire, "expire" => $expire,
"txHex" => $txHex "txHex" => $txHex
]; ];
return $this->send($params, 'Chain33.SignRawTx'); return $this->send($params, 'Chain33.SignRawTx');
} }
public function getBlock2MainInfo($start, $end)
{
$params = [
"Start" => $start,
"End" => $end,
];
return $this->send($params, 'paracross.GetBlock2MainInfo');
}
public function sendTrade($data) public function sendTrade($data)
{ {
$params = [ $params = [
"data" => $data, "data" => $data,
]; ];
return $this->send($params, 'Chain33.SendTransaction'); return $this->send($params, 'Chain33.SendTransaction');
} }
public function getHeight($params = [])
{
$params = [
"data" => 'user.p.game.',
];
return $this->send($params, 'paracross.GetHeight');
}
/** /**
* 获取最新的区块 * 获取最新的区块
*/ */
...@@ -329,12 +350,12 @@ class Chain33Service ...@@ -329,12 +350,12 @@ class Chain33Service
public function getTxByAddr($addr, $flag, $count, $direction, $height, $index) public function getTxByAddr($addr, $flag, $count, $direction, $height, $index)
{ {
$params = [ $params = [
'addr' => $addr, 'addr' => $addr,
'flag' => $flag, 'flag' => $flag,
'count' => $count, 'count' => $count,
'direction' => $direction, 'direction' => $direction,
'height' => $height, 'height' => $height,
'index' => $index 'index' => $index
]; ];
return $this->send($params, 'Chain33.GetTxByAddr'); return $this->send($params, 'Chain33.GetTxByAddr');
} }
...@@ -359,9 +380,9 @@ class Chain33Service ...@@ -359,9 +380,9 @@ class Chain33Service
public function unLockWallet($password) public function unLockWallet($password)
{ {
$params = [ $params = [
'passwd' => $password, 'passwd' => $password,
'walletorticket' => false, 'walletorticket' => false,
'timeout' => 30 'timeout' => 30
]; ];
return $this->send($params, 'Chain33.UnLock'); return $this->send($params, 'Chain33.UnLock');
} }
......
...@@ -14,71 +14,95 @@ class CrossChainController extends Controller ...@@ -14,71 +14,95 @@ class CrossChainController extends Controller
* *
* @return array * @return array
*/ */
public function actionAutoTransfer() public function actionAutoTransfer($step, $is_with_draw)
{ {
$model = CoinCrossChain::find()->where(['send_result' => "0"])->limit(20)->groupBy('transfer_number')->orderBy('id')->asArray()->all(); $redis = Yii::$app->redis;
$model = CoinCrossChain::find()->where(['send_result' => "0", 'step' => (int)$step, 'is_with_draw' => (int)$is_with_draw, 'query_result' => '0'])->asArray()->all();
if (empty($model)) { if (empty($model)) {
echo date('Y-m-d H:i:s') . '暂无跨链交易计划' . PHP_EOL; echo date('Y-m-d H:i:s') . ' STEP: ' . $step . '暂无跨链交易计划' . PHP_EOL;
return 0; return 0;
} }
$current_time = time();
foreach ($model as $val) { foreach ($model as $val) {
$isExist = CoinCrossChain::find() if ($step > 1) {
->where(['transfer_number' => $val['transfer_number']]) $isExist = CoinCrossChain::find()
->andWhere(['<', 'id', (int)$val['id']]) ->where(['transfer_number' => $val['transfer_number']])
->orderBy('id desc') ->andWhere(['<', 'id', (int)$val['id']])
->asArray() ->orderBy('id desc')
->one(); ->asArray()
//上一步发送成功,未查询 ->one();
if ('success' != $isExist['query_result'] && !empty($isExist)) { //上一步发送成功,未查询
if ('success' != $isExist['query_result'] && !empty($isExist)) {
continue;
}
}
$cache_transfering_time = $redis->hget(CoinCrossChain::CROSS_CHAIN_TRANSFERING, $val['address'] . ':' . $val['is_with_draw'] . ':' . $val['id']);
if (true == $cache_transfering_time) {
continue; continue;
} }
$redis->hmset(CoinCrossChain::CROSS_CHAIN_TRANSFERING, $val['address'] . ':' . $val['is_with_draw'] . ':' . $val['id'], $current_time);
//go(function () use ($val) { go(function () use ($val, $redis) {
// \Co::sleep(0.5); \Co::sleep(0.5);
$transfer_url = $val['transfer_url']; $transfer_url = $val['transfer_url'];
$transfer_url = explode(':', $transfer_url); $transfer_url = explode(':', $transfer_url);
$node_params = [ $node_params = [
'scheme' => $transfer_url[0], 'scheme' => $transfer_url[0],
'host' => str_replace('//', '', $transfer_url[1]), 'host' => str_replace('//', '', $transfer_url[1]),
'port' => isset($transfer_url[2]) ? $transfer_url[2] : '' 'port' => isset($transfer_url[2]) ? $transfer_url[2] : '',
]; ];
$service = new Chain33Service($node_params); $service = new Chain33Service($node_params);
$sign_str = $val['txhex']; $sign_str = $val['txhex'];
$result = $service->sendTransaction($sign_str); $result = $service->sendTransaction($sign_str);
if (0 != $result['code']) { if (0 == $result['code']) {
$msg = $result['msg']; $send_result = $result['result'];
goto doEnd; $currentModel = CoinCrossChain::findOne($val['id']);
}
$send_result = $result['result'];
doEnd :
$currentModel = CoinCrossChain::findOne($val['id']);
if (isset($msg)) {
$currentModel->msg = $msg;
}
if (isset($send_result)) {
$currentModel->send_result = $send_result; $currentModel->send_result = $send_result;
$currentModel->msg = 0;
$currentModel->save();
$redis->hdel(CoinCrossChain::CROSS_CHAIN_TRANSFERING, $val['address'] . ':' . $val['is_with_draw'] . ':' . $val['id']);
} }
$currentModel->save();
//}); if (0 != $result['code'] && (true == strstr($result['msg'], 'Balance'))) {
$currentModel = CoinCrossChain::findOne($val['id']);
$currentModel->msg = $result['msg'];
$currentModel->save();
$redis->hdel(CoinCrossChain::CROSS_CHAIN_TRANSFERING, $val['address'] . ':' . $val['is_with_draw'] . ':' . $val['id']);
} else if (0 != $result['code'] && (false == strstr($result['msg'], 'ErrDupTx'))) {
$redis->hdel(CoinCrossChain::CROSS_CHAIN_TRANSFERING, $val['address'] . ':' . $val['is_with_draw'] . ':' . $val['id']);
} else {
}
});
} }
echo date('Y-m-d H:i:s') . '跨链交易成功' . PHP_EOL; echo date('Y-m-d H:i:s') . ' STEP: ' . $step . '跨链交易成功' . PHP_EOL;
return 0; return 0;
} }
public function actionQueryTransaction() public function actionQueryTransaction()
{ {
$model = CoinCrossChain::find()->where(['<>', 'send_result', '0'])->andWhere(['msg' => '0'])->limit(20)->asArray()->all(); $redis = Yii::$app->redis;
$model = CoinCrossChain::find()->where(['<>', 'send_result', '0'])->andWhere(['msg' => '0'])->asArray()->all();
if (empty($model)) { if (empty($model)) {
echo date('Y-m-d H:i:s') . '暂无跨链交易计划' . PHP_EOL; echo date('Y-m-d H:i:s') . '暂无跨链交易计划' . PHP_EOL;
return 0; return 0;
} }
//查询共识高度
$node_params = [
'scheme' => 'https',
'host' => 'jiedian1.bityuan.com',
'port' => 8801
];
$service = new Chain33Service($node_params);
$result = $service->getHeight();
$consensHeight = $result['result']['consensHeight'];
$current_time = time();
foreach ($model as $val) { foreach ($model as $val) {
$node_params = $val['transfer_url']; $node_params = $val['transfer_url'];
$node_params = explode(':', $node_params); $node_params = explode(':', $node_params);
...@@ -90,30 +114,53 @@ class CrossChainController extends Controller ...@@ -90,30 +114,53 @@ class CrossChainController extends Controller
$service = new Chain33Service($node_params); $service = new Chain33Service($node_params);
$send_result = $val['send_result']; $send_result = $val['send_result'];
$result = $service->QueryTransaction($send_result); $result = $service->QueryTransaction($send_result);
if (-1 == $result['code']) { $switch = true;
if('tx not exist' == $result['msg']) continue;
$msg = $result['msg'];
$query_result = $result['code'];
goto doEnd;
// echo date('Y-m-d H:i:s') . 'ID:' . $val['id'] . '查询错误' . PHP_EOL;
// continue;
}
if (isset($result['result']['actionName']) && 'unknown' == $result['result']['actionName']) { if (isset($result['result']['actionName']) && 'unknown' == $result['result']['actionName']) {
$redis->hdel(CoinCrossChain::CROSS_CHAIN_CACHE_FAIL, $val['address'] . ':' . $val['is_with_draw']);
$query_result = 'success'; $query_result = 'success';
$msg = 'success'; $msg = 'success';
$height = isset($result['result']['height']) ? $result['result']['height'] : 0;
goto doEnd;
} else if (isset($result['result']['receipt']['ty']) && 2 == $result['result']['receipt']['ty']) { } else if (isset($result['result']['receipt']['ty']) && 2 == $result['result']['receipt']['ty']) {
$redis->hdel(CoinCrossChain::CROSS_CHAIN_CACHE_FAIL, $val['address'] . ':' . $val['is_with_draw']);
$query_result = 'success'; $query_result = 'success';
$msg = 'success'; $msg = 'success';
$height = isset($result['result']['height']) ? $result['result']['height'] : 0;
goto doEnd;
} else { } else {
$query_result = 'fail'; $cache_error_time = $redis->hget(CoinCrossChain::CROSS_CHAIN_CACHE_FAIL, $val['address'] . ':' . $val['is_with_draw']);
foreach ($result['result']['receipt']['logs'] as $log) { if (false == $cache_error_time) {
if (is_array($log['log'])) continue; $redis->hmset(CoinCrossChain::CROSS_CHAIN_CACHE_FAIL, $val['address'] . ':' . $val['is_with_draw'], $current_time);
$msg = isset($log['log']) ? $log['log'] : '查询错误'; continue;
}
if (($current_time - $cache_error_time) < 60) {
continue;
}
$redis->hdel(CoinCrossChain::CROSS_CHAIN_CACHE_FAIL, $val['address'] . ':' . $val['is_with_draw']);
if (-1 == $result['code']) {
$msg = $result['msg'];
$query_result = $result['code'];
$switch = false;
goto doEnd;
} else {
$query_result = 'fail';
foreach ($result['result']['receipt']['logs'] as $log) {
if (is_array($log['log'])) continue;
$msg = isset($log['log']) ? $log['log'] : '查询错误';
}
$switch = false;
goto doEnd;
} }
} }
doEnd : doEnd :
if (CoinCrossChain::RECHARGE == $val['is_with_draw'] && $val['step'] == 2 && $switch && isset($height) && ($consensHeight < $height)) {
continue;
}
$currentModel = CoinCrossChain::findOne($val['id']); $currentModel = CoinCrossChain::findOne($val['id']);
$currentModel->query_result = $query_result; $currentModel->query_result = $query_result;
$currentModel->msg = $msg; $currentModel->msg = $msg;
...@@ -121,7 +168,6 @@ class CrossChainController extends Controller ...@@ -121,7 +168,6 @@ class CrossChainController extends Controller
$count = CoinCrossChain::find()->where(['transfer_number' => $val['transfer_number']])->andWhere(['query_result' => 'success'])->count(); $count = CoinCrossChain::find()->where(['transfer_number' => $val['transfer_number']])->andWhere(['query_result' => 'success'])->count();
if (3 == $count) { if (3 == $count) {
$redis = Yii::$app->redis;
$key = $val['address'] . '_' . $val['is_with_draw']; $key = $val['address'] . '_' . $val['is_with_draw'];
if ($redis->exists($key)) { if ($redis->exists($key)) {
$redis->del($key); $redis->del($key);
......
...@@ -4,6 +4,7 @@ namespace console\controllers; ...@@ -4,6 +4,7 @@ namespace console\controllers;
use common\business\Chain33Business; use common\business\Chain33Business;
use common\models\psources\CoinGameBet; use common\models\psources\CoinGameBet;
use common\service\chain33\Chain33Service;
use yii\console\Controller; use yii\console\Controller;
use Yii; use Yii;
...@@ -17,47 +18,46 @@ class GameBetController extends Controller ...@@ -17,47 +18,46 @@ class GameBetController extends Controller
public function actionGameStatus() public function actionGameStatus()
{ {
$nodes = \Yii::$app->params['chain_parallel']['wasm']; $nodes = \Yii::$app->params['chain_parallel']['wasm'];
if(empty($nodes)){ if (empty($nodes)) {
echo date('Y-m-d H:i:s') . '无节点'.PHP_EOL; echo date('Y-m-d H:i:s') . '无节点' . PHP_EOL;
return 0; return 0;
} }
foreach ($nodes as $key => $node) { foreach ($nodes as $key => $node) {
$service = new Chain33Business(); $service = new Chain33Business();
$result = $service->getGameStatus($node); $result = $service->getGameStatus($node);
if (0 !== $result['code']) { if (0 !== $result['code']) {
echo $key.':'.date('Y-m-d H:i:s') . $result['msg'].PHP_EOL; echo $key . ':' . date('Y-m-d H:i:s') . $result['msg'] . PHP_EOL;
continue; continue;
} }
$queryResultItems = $result['result'] ?? []; $queryResultItems = $result['result'] ?? [];
if (empty($queryResultItems)) { if (empty($queryResultItems)) {
echo $key.':'.date('Y-m-d H:i:s') . 'error'.PHP_EOL; echo $key . ':' . date('Y-m-d H:i:s') . 'error' . PHP_EOL;
continue; continue;
} }
$resultJSON = json_decode($queryResultItems['queryResultItems'][0]['resultJSON'], true); $resultJSON = json_decode($queryResultItems['queryResultItems'][0]['resultJSON'], true);
$current_round = $resultJSON['current_round']; $current_round = $resultJSON['current_round'];
$cache_current_round = Yii::$app->redis->get('chain33_game_bet_status_'.$key); $cache_current_round = Yii::$app->redis->get('chain33_game_bet_status_' . $key);
if (empty($cache_current_round)) { if (empty($cache_current_round)) {
$cache_current_round = CoinGameBet::find()->where(['platform' => $key])->max('round'); $cache_current_round = CoinGameBet::find()->where(['platform' => $key])->max('round');
Yii::$app->redis->set('chain33_game_bet_status_'.$key, $cache_current_round, 'EX', 300); Yii::$app->redis->set('chain33_game_bet_status_' . $key, $cache_current_round, 'EX', 300);
} }
$cache_current_round = (false == $cache_current_round ? 0 : $cache_current_round); $cache_current_round = (false == $cache_current_round ? 0 : $cache_current_round);
if ($cache_current_round >= $current_round) { if ($cache_current_round >= $current_round) {
echo $key.':'.date('Y-m-d H:i:s') . '数据已为最新' . PHP_EOL; echo $key . ':' . date('Y-m-d H:i:s') . '数据已为最新' . PHP_EOL;
continue; continue;
} }
Yii::$app->redis->set('chain33_game_bet_status_'.$key, $current_round, 'EX', 300); Yii::$app->redis->set('chain33_game_bet_status_' . $key, $current_round, 'EX', 300);
$result = $service->getBetStatus($cache_current_round, $current_round, '', $node); $result = $service->getBetStatus($cache_current_round, $current_round, '', $node);
if (0 !== $result['code']) { if (0 !== $result['code']) {
echo $key.':'.date('Y-m-d H:i:s') . '数据错误' . PHP_EOL; echo $key . ':' . date('Y-m-d H:i:s') . '数据错误' . PHP_EOL;
continue; continue;
} }
$queryResultItems = $result['result'] ?? []; $queryResultItems = $result['result'] ?? [];
if (empty($queryResultItems)) { if (empty($queryResultItems)) {
echo $key.':'.date('Y-m-d H:i:s') . '数据错误' . PHP_EOL; echo $key . ':' . date('Y-m-d H:i:s') . '数据错误' . PHP_EOL;
continue; continue;
} }
$platform = $key; $platform = $key;
...@@ -69,7 +69,7 @@ class GameBetController extends Controller ...@@ -69,7 +69,7 @@ class GameBetController extends Controller
]; ];
} }
CoinGameBet::loadArray($datas); CoinGameBet::loadArray($datas);
echo $platform.':'.date('Y-m-d H:i:s') . '数据更新成功'.PHP_EOL; echo $platform . ':' . date('Y-m-d H:i:s') . '数据更新成功' . PHP_EOL;
continue; continue;
} }
return 0; return 0;
...@@ -77,44 +77,66 @@ class GameBetController extends Controller ...@@ -77,44 +77,66 @@ class GameBetController extends Controller
public function actionBetUpdate() public function actionBetUpdate()
{ {
$service = new Chain33Business();
$node_params = [
'scheme' => 'https',
'host' => 'jiedian1.bityuan.com',
'port' => 8801
];
$result = $service->getLastHeader($node_params);
$main_height = isset($result['result']['height']) ? $result['result']['height'] : 0;
$safe_main_height = $main_height - 14;
$nodes = \Yii::$app->params['chain_parallel']['wasm']; $nodes = \Yii::$app->params['chain_parallel']['wasm'];
if(empty($nodes)){ if (empty($nodes)) {
echo date('Y-m-d H:i:s') . '无节点'.PHP_EOL; echo date('Y-m-d H:i:s') . '无节点' . PHP_EOL;
return 0; return 0;
} }
foreach ($nodes as $key => $node) { foreach ($nodes as $key => $node) {
$service = new Chain33Business(); $service = new Chain33Service($node);
$result = $service->getLastHeader($node); $result = $service->getLastHeader();
$height = $result['result']['height']; $height = $result['result']['height'];
$main_info = $service->getBlock2MainInfo($height - 14, $height);
if (!isset($main_info['result']['items'])) continue;
$items = $main_info['result']['items'];
$items = $this->arraySort($items, 'mainHeight');
$safe_height = 0;
foreach ($items as $item) {
if ($safe_main_height > $item['mainHeight']) {
$safe_height = $item['height'];
break;
}
}
echo $key . ':' . date('Y-m-d H:i:s') . '当前主链高度为:' . $main_height . ';当前平行链高度为:' . $height . ';当前安全高度为:' . $safe_height . PHP_EOL;
$models = CoinGameBet::find()->select('round')->where([ $models = CoinGameBet::find()->select('round')->where([
'and', 'and',
['valid' => CoinGameBet::VAILD_FALSE], ['valid' => CoinGameBet::VAILD_FALSE],
['<', 'height', $height - 12], ['<', 'height', $safe_height],
['platform' => $key] ['platform' => $key]
])->all(); ])->all();
if(empty($models)){ if (empty($models)) {
echo $key.':'.date('Y-m-d H:i:s') . '无需更新的数据'.PHP_EOL; echo $key . ':' . date('Y-m-d H:i:s') . '无需更新的数据' . PHP_EOL;
continue; continue;
} }
$valid_arr = []; $valid_arr = [];
foreach ($models as $model) { foreach ($models as $model) {
$valid_arr[] = $model->round; $valid_arr[] = $model->round;
} }
$result = $service->getBetStatus('', '', $valid_arr, $node); $business = new Chain33Business();
if( 0 !== $result['code']){ $result = $business->getBetStatus('', '', $valid_arr, $node);
echo $key.':'.date('Y-m-d H:i:s') . '数据错误'.PHP_EOL; if (0 !== $result['code']) {
echo $key . ':' . date('Y-m-d H:i:s') . '数据错误' . PHP_EOL;
continue; continue;
} }
$queryResultItems = $result['result'] ?? []; $queryResultItems = $result['result'] ?? [];
if(empty($queryResultItems)){ if (empty($queryResultItems)) {
echo $key.':'.date('Y-m-d H:i:s') . '数据错误'.PHP_EOL; echo $key . ':' . date('Y-m-d H:i:s') . '数据错误' . PHP_EOL;
continue; continue;
} }
$platform = $key; $platform = $key;
foreach ($queryResultItems['queryResultItems'] as $key => $val){ foreach ($queryResultItems['queryResultItems'] as $key => $val) {
if (false == $val['found']) continue; if (false == $val['found']) continue;
$resultArr = json_decode($val['resultJSON'],true); $resultArr = json_decode($val['resultJSON'], true);
CoinGameBet::updateAll([ CoinGameBet::updateAll([
'amount' => $resultArr['amount'], 'amount' => $resultArr['amount'],
'height' => $resultArr['height'], 'height' => $resultArr['height'],
...@@ -122,14 +144,25 @@ class GameBetController extends Controller ...@@ -122,14 +144,25 @@ class GameBetController extends Controller
'rand_num' => $resultArr['rand_num'], 'rand_num' => $resultArr['rand_num'],
'player_win' => $resultArr['player_win'], 'player_win' => $resultArr['player_win'],
'valid' => CoinGameBet::VAILD_TRUE 'valid' => CoinGameBet::VAILD_TRUE
],[ ], [
'round' => $resultArr['round'], 'round' => $resultArr['round'],
'platform' => $platform 'platform' => $platform
]); ]);
} }
echo $platform.':'.date('Y-m-d H:i:s') . '数据更新成功'.PHP_EOL; echo $platform . ':' . date('Y-m-d H:i:s') . '数据更新成功' . PHP_EOL;
continue; continue;
} }
return 0; return 0;
} }
protected function arraySort($array, $keys, $sort = SORT_DESC)
{
$keysValue = [];
foreach ($array as $k => $v) {
$keysValue[$k] = $v[$keys];
}
array_multisort($keysValue, $sort, $array);
return $array;
}
} }
\ No newline at end of file
#!/bin/bash
while true; do php /var/www/html/token_pwallet/yii cross-chain/auto-transfer >> /var/www/html/auto-transfer.log 2>&1; sleep 15; done &
\ No newline at end of file
#!/bin/bash
while true; do php /var/www/html/token_pwallet/yii game-bet/game-status >> /var/log/game-bet.log 2>&1; sleep 5; done &
\ No newline at end of file
#!/bin/bash
while true; do php /var/www/html/token_pwallet/yii cross-chain/query-transaction >> /var/www/html/query-transaction.log 2>&1; sleep 20; done &
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment