usdt充值 btc网络(区块充值)

usdt充值 btc网络(区块充值)_第1张图片

下边介绍基于 比特币网络的usdt做充值

基于比特币网络发行的USDT (基于Omni协议发行)

1.首先现在节点服务器上生成每个用户的钱包地址

  /**
     * 方法:生成USDT地址
     * @param $user_id
     * @return bool
     */
    public function usdtcoin($user_id)
    {
        $lists=$this->usdt->getaddressesbyaccount("$user_id");
        if (count($lists)>0){
            return $lists[0];
        }
        $address=$this->usdt->getnewaddress("$user_id");
        if (strlen($address) != 34) {
            return false;
        }
        return $address;
    }

$user_id是账号名,需要唯一。

返回的是账户地址。

getnewaddress 是比特币的命令

  /**
     * 调用返回钱包交易清单,可以使用地址或区块进行过滤
     * @param $txid
     * @return mixed
     */
    public function listtransactions($txid){
        return $this->usdt->omni_listtransactions($txid);
    }
  • txid:地址过滤器,字符串,可选
  • count:返回结果数量,数值,可选,默认值:10
  • skip:跳过结果数量,数值,可选,默认值:0
  • startblock:检索的起始区块,数值,可选,默认值:0
  • endblock :检索的最后区块,数值,可选,默认值:999999999

 usdt充值 btc网络(区块充值)_第2张图片

    ["txid"] => string(64) "961400b6923d5c2d57ecd27f59e127b01ebe0a7fe3635eca454b0d268a6012a5"//16进制编码的交易哈希
    ["fee"] => string(10) "0.00015762"//交易手续费
    ["sendingaddress"] => string(34) "3KeC2JqGHqW6kuUBJKjAHmmfUThj2RiR1F"//发送方比特币地址
    ["referenceaddress"] => string(34) "18An5WWLHR59NpHdKzPoDjKLKULsMpP1ci"//作为参照的比特币地址
    ["ismine"] => bool(true)//交易是否与钱包内某个地址相关
    ["version"] => int(0)//交易版本
    ["type_int"] => int(0)//交易类型代码
    ["type"] => string(11) "Simple Send"//交易类型字符串
    ["propertyid"] => int(31)
    ["divisible"] => bool(true)
    ["amount"] => string(10) "1.00000000"//交易金额
    ["valid"] => bool(true)//交易是否有效
    ["blockhash"] => string(64) "00000000000000000012a07886b2a27d75cec808c8225f3d38a0b76e159f652f"
    ["blocktime"] => int(1560768796)//交易的区块时间戳
    ["positioninblock"] => int(1872)//交易在区块内的序号
    ["block"] => int(581100)
    ["confirmations"] => int(33)//交易的确认数

 最后就是做个定时器,定时扫描钱包地址,出现新的交易然后存入数据库。

如果不会写定时器,请参考我前段时间写的定时器:https://blog.csdn.net/jmkweb/article/details/89684225

下边附上定时扫描钱包,确认充值成功

setName('usdt')
            ->setDescription('充值');
    }

    protected function execute(Input $input, Output $output){
        //每隔1000ms触发一次
        $id = \swoole_timer_tick(5000, function ($timer_id) {
            try{
                $log=[];
                $user_asset=[];
                $account_log=[];
                file_put_contents('usdt.log',date('Y-m-d H:i:s').'进入充值'.PHP_EOL,FILE_APPEND);
                $user=Db::name('users')->where(['status'=>1,'token_address'=>['<>','']])->select();
                foreach ($user as $k=>$v){
                    sleep(2);
                    $user_address=(new Coins())->listtransactions($v['token_address']);
                    file_put_contents('usdt.log',json_encode($user_address,true).PHP_EOL,FILE_APPEND);
                    if (!empty($user_address)){
                        $user_txids=Db::name('recharge')->where(['user_id'=>$v['id']])->column('usdt_order_num');
                        file_put_contents('usdt.log','有交易信息'.PHP_EOL,FILE_APPEND);
                        $txids=$user_address[0]['txid'];
                        $last_txid=$txids;
//                        $last_txid=end($txids);
                        if (!in_array($last_txid,$user_txids)){
                            $transaction=(new Coins())->gettransaction($last_txid);
                            file_put_contents('usdt.log','交易记录存在'.json_encode($transaction).PHP_EOL,FILE_APPEND);
                            if (is_array($transaction)){
                                if ($transaction['referenceaddress']==$v['token_address']){
                                    if ($transaction['valid']){
                                        file_put_contents('usdt.log','交易记录存在11'.PHP_EOL,FILE_APPEND);
                                        $log[]=[
                                            'user_id'=>$v['id'],
                                            'order_num'=>Checking::ordeSnByUnique('order_num',Db::name('recharge')),
                                            'usdt_order_num'=>$last_txid,
                                            'money'=>$transaction['amount'],
                                            'sender'=>$transaction['sendingaddress'],
                                            'recipient'=>$transaction['referenceaddress'],
                                            'status'=>2,
                                            'create_time'=>date('YmdHis'),
                                            'qr_time'=>date('YmdHis'),
                                            'block_time'=>date('Y-m-d H:i:s',$transaction['blocktime']),
                                            'block_t_time'=>$transaction['blocktime']
                                        ];
                                        $account_log[]=[
                                            'user_id'=>$v['id'],
                                            'money'=>$transaction['amount'],
                                            'type'=>1,
                                            'message'=>'充值',
                                            'status'=>2,
                                            'class'=>2,
                                            'create_time'=>date('YmdHis')
                                        ];
                                        $user_asset[]=[
                                            'user_id'=>$v['id'],
                                            'usdt'=>['inc',$transaction['amount']]
                                        ];
                                    }
                                }
                                file_put_contents('usdt.log',date('Y-m-d H:i:s').'交易无效'.PHP_EOL,FILE_APPEND);
                            }
                        }
                    }
                }
                if (!empty($log)){
                    Db::name('recharge')->insertAll($log);
                }
                if (!empty($user_asset)){
                    $asset= new AssetMode();
                    $asset->isUpdate(true)->saveAll($user_asset);
                }
                if (!empty($account_log)){
                    $asset= new UsersAccountLog();
                    $asset->isUpdate(true)->saveAll($account_log);
                }
            }catch (Exception $exception){
                file_put_contents('usdt.log',date('Y-m-d H:i:s').$exception->getMessage().PHP_EOL,FILE_APPEND);
            }
        });
    }
}

 

你可能感兴趣的:(区块链)