CrossChainController.php 4.61 KB
<?php

namespace api\controllers;

use api\base\BaseController;
use common\models\psources\CoinAirDropTrade;
use common\models\psources\CoinCrossChain;
use common\service\chain33\Chain33Service;
use Yii;
use yii\db\Exception;


class CrossChainController extends BaseController
{
    public function actionTransfer()
    {
        $code = -1;
        $request = Yii::$app->request;
        if (!$request->isPost) {
            $msg = '请求错误!';
            goto doEnd;
        }
        $post = $request->post();
        if (3 != count($post['txs'])) {
            $msg = '交易笔数错误!';
            goto doEnd;
        }

        $data['is_with_draw'] = (false == $post['isWithdraw']) ? 0 : 1;
        $data['address'] = $post['address'];
        $data['transfer_number'] = date('YmdHis') . self::getrandnums();

        $redis = Yii::$app->redis;
        if ($redis->exists($post['address'] . '_' . $data['is_with_draw'])) {
            $msg = '存在未完成的交易!';
            goto doEnd;
        }
        $redis->set($post['address'] . '_' . $data['is_with_draw'], $post['address'] . '_' . $data['is_with_draw']);

//        $isExist = CoinCrossChain::find()
//            ->where(['address' => $post['address'], 'is_with_draw' => $data['is_with_draw']])
//            ->andWhere(['<>', 'query_result', 'success'])
//            ->asArray()->all();
//
//        if ($isExist) {
//            $msg = '存在未完成的交易!';
//            goto doEnd;
//        }

        foreach ($post['txs'] as $key => $val) {
            $model = new CoinCrossChain();
            $data['txhex'] = $val['tx'];
            $data['transfer_url'] = $val['url'];
            $model->load($data, '');
            $model->save();
        }

        $code = 0;
        $msg = 'success';
        doEnd :
        return ['code' => $code, 'msg' => $msg];
    }

    public function actionTransferStatus()
    {
        $code = -1;
        $msg = 'fail';
        $data = null;
        $step = 0;
        $request = Yii::$app->request;
        if (!$request->isGet) {
            $msg = '请求错误!';
            goto doEnd;
        }

        $address = $request->get('address', '');
        $is_with_draw = $request->get('isWithdraw', '');
        if (empty($address)) {
            $msg = '参数错误!';
            goto doEnd;
        }

        $model = CoinCrossChain::find()->where(['address' => $address, 'is_with_draw' => $is_with_draw])->orderBy("id desc")->limit(3)->asArray()->all();
        if (empty($model)) {
            $msg = '数据不存在!';
            goto doEnd;
        }
        sort($model);

        foreach ($model as $key => $val) {
            //未交易
            if ('0' == $val['send_result'] && '0' == $val['query_result'] && '0' == $val['msg']) {
                $step = $key + 1;
                $code = 0;
                $msg = '第' . ($key + 1) . '笔交易尚未执行';
                goto doEnd;
            }
            //交易报错
            if ('0' == $val['send_result'] && '0' == $val['query_result'] && true == $val['msg']) {

                $step = $key + 1;
                $code = -1;
                $msg = $val['msg'];
                goto doEnd;
            }
            //交易成功
            if (true == $val['send_result'] && '0' == $val['query_result'] && '0' == $val['msg']) {
                $step = $key + 1;
                $code = 0;
                $msg = $val['send_result'];
                goto doEnd;
            }
            //交易成功,查询失败
            if (true == $val['send_result'] && 'fail' == $val['query_result']) {
                $step = $key + 1;
                $code = -1;
                $msg = $val['msg'];
                goto doEnd;
            }
            //交易成功,查询成功
            if (true == $val['send_result'] && 'success' == $val['query_result'] && 'success' == $val['msg']) {
                if (2 == $key){
                    $step = (2 == $key) ? 4 : ($key + 2);
                    $code = 0;
                    $msg = $val['send_result'];
                    goto doEnd;
                }
                continue;
            }
        }

        doEnd :
        $data = [
            'step' => $step
        ];
        return ['code' => $code, 'msg' => $msg, 'data' => $data];
    }

    public static function getrandnums()
    {
        $arr = array();
        while (count($arr) < 6) {
            $arr[] = rand(0, 9);
            $arr = array_unique($arr);
        }
        return implode("", $arr);
    }
}