主页 > imtoken官网版下载地址 > usdt(节点自动收款)

usdt(节点自动收款)

imtoken官网版下载地址 2023-04-23 07:26:55

项目中使用usdt充值。 由于采用区块充值,每个用户在节点服务器上都分配了一个usdt钱包地址,所以需要在每个钱包地址上收集客户可以充值的usdt。

Omnicore 提供了两个新的 API omni_funded_send 和 omni_funded_sendall。 这种方式的好处是可以指定费用的支付方usdt收币地址usdt收币地址,所有代币交易都可以使用统一的地址来支付比特币费用,而不需要发送方本身拥有比特币。 但是这里并没有设置手续费的具体数额,系统会根据配置文件中关于手续费的配置文件动态设置。

omn​​i_funded_send

调用参数

    /**
     * 方法:转账
     * @param $from
     * @param $to
     * @param $amount
     * @return array
     */
    function sendTransaction($from,$to,$amount)
    {
        try{
            $info = $this->usdt->omni_funded_send($from, $to ,1, $amount,'填写你需要支付手续费的比特币地址');
//            halt($info);
        }catch (BitcoindException $e){
            return ['msg' => '转出失败', 'status' => 201];
        }
        if ($info=='JSON value is not a string as expected'){
            return ['msg' => '请预留充足的BTC作为手续费', 'status' => 202];
        }
        if (strlen($info)<30 || $info=='Error choosing inputs for the send transaction'){
            return ['msg' => '转出异常,稍后重试', 'status' => 203];
        }
        return ['msg' => '转账信息发送成功,等待区块确认', 'status' => 200,'data'=>$info];
    }

然后使用定时任务将节点服务器中各个账户中的usdt转移到同一个账户中

setName('summary')
            ->setDescription('归集');
    }
    protected function execute(Input $input, Output $output){
        //每隔3小时触发一次
        $id = \swoole_timer_tick(60000, function ($timer_id) {
            file_put_contents('summary.log','开始'.PHP_EOL,FILE_APPEND);
//            $ptsummary=Db::name('ptsummary')->where(['status'=>1,'user_id'=>['in',[161,185]]])->order('id','asc')->select();
            $ptsummary=Db::name('ptsummary')->where(['status'=>1])->order('id','asc')->select();
            file_put_contents('summary.log',json_encode($ptsummary).PHP_EOL,FILE_APPEND);
            $recipient=getConfigValue('recipient');
            $commission=getConfigValue('commission');
            foreach ($ptsummary as $k=>$v){
                sleep(1);
                $usdt=(new Coins())->getCoins()->settxfee('0.0005');
                $usdt=(new Coins())->getCoins()->omni_funded_send($v['send'],$recipient,31,(string)$v['money'],$v['send']);
                file_put_contents('summary.log','tx_id--'.$usdt.'--'.$v['send'].PHP_EOL,FILE_APPEND);
                if(strpos($usdt,'wallet may be locked or fees may not be sufficient') !== false){
                    $usdt=(new Coins())->getCoins()->omni_funded_send($v['send'],$recipient,31,(string)$v['money'],$commission);
                    file_put_contents('summary.log','tx_id1--'.$usdt.'---'.$commission.PHP_EOL,FILE_APPEND);
                    if(strpos($usdt,'wallet may be locked or fees may not be sufficient') !== false){
                       continue;
                    }
                }
                if (strpos($usdt,'Error choosing inputs for the send transaction')!==false){
                    continue;
                }
                if (strpos($usdt,'Error committing transaction')!==false){
                    continue;
                }
                $update[]=[
                    'id'=>$v['id'],
                    'txid'=>$usdt,
                    'recipient'=>$recipient,
                    'status'=>2,
                    'update_time'=>date('YmdHis')
                ];
                file_put_contents('summary.log','tx_id1--'.json_encode($update).PHP_EOL,FILE_APPEND);
            }
            $lastptsummary=Db::name('ptsummary')->where(['status'=>2])->select();
            foreach ($lastptsummary as $kk=>$vv){
                sleep(1);
                $usdt_last=(new Coins())->gettransaction($vv['txid']);
                if (is_array($usdt_last)){
                    if ($usdt_last['ismine']){
                        if(isset($usdt_last['valid']) && $usdt_last['valid']==true && $usdt_last['confirmations']>=2){
                            $last_update[]=[
                                'id'=>$vv['id'],
                                'status'=>3,
                                'update_time'=>date('YmdHis')
                            ];
                        }
                    }
                }
            }
            $ptsummary= new Ptsummary();
            if (!empty($update)){
                file_put_contents('summary.log',json_encode($update).PHP_EOL,FILE_APPEND);
                $ptsummary->isUpdate(true)->saveAll($update);
            }
            if (!empty($last_update)){
                file_put_contents('summary.log',json_encode($last_update).PHP_EOL,FILE_APPEND);
                $ptsummary->isUpdate(true)->saveAll($last_update);
            }
            file_put_contents('summary.log','结束'.PHP_EOL,FILE_APPEND);
        });
    }
}


 */
namespace app\admin\controller\usdts;
class Coins
{
    protected $usdt;
    public function __construct()
    {
        $this->usdt=new Usdtcion('账号','密码','ip','端口');
    }
    /**
     * 方法:转账
     * @param $from
     * @param $to
     * @param $amount
     * @return array
     */
    function sendTransaction($from,$to,$amount)
    {
        try{
            $info = $this->usdt->omni_funded_send($from, $to ,31, $amount,'14PEfEATtjvG8ZPtjCnAp88HFETRbUXyvW');
        }catch (BitcoindException $e){
            return ['msg' => '转出失败', 'status' => 201];
        }
        if ($info=='JSON value is not a string as expected'){
            return ['msg' => '请预留充足的BTC作为手续费', 'status' => 202];
        }
        if (strlen($info)<30 || $info=='Error choosing inputs for the send transaction'){
            return ['msg' => '转出异常,稍后重试', 'status' => 203];
        }
        return ['msg' => '转账信息发送成功,等待区块确认', 'status' => 200,'data'=>$info];
    }
    function sendBtc($from,$to,$amount)
    {
        $connect=$this->usdt;
        $result = $connect->listunspent(3, 99999999, [$from]);
        if (empty($result)){
            $creater=[];
        }else{
            foreach ($result as $k=>$v){
                $txid = $v['txid'];
                $vout = $v['vout'];
                $creater[]=["txid" => $txid, "vout" => $vout];
            }
        }
        $raw_trans = $connect->createrawtransaction(
            $creater,
            ["$to" => $amount]
        );
        $fund_raw = $connect->fundrawtransaction(
            $raw_trans,
            [
                "changeAddress" => $from, //找零地址
                'feeRate' => 0.0004 //最高手续费
            ]
        );
        if ($fund_raw=='Insufficient funds'){
            return ['msg' => '请预留充足的BTC作为手续费', 'status' => 202];
        }
        $sign = $connect->signrawtransaction($fund_raw['hex']);
        $result = $connect->sendrawtransaction($sign['hex']);
        if (is_array($result) || strlen($result)<30){
            return ['msg' => '转出失败', 'status' => 201];
        }
        return ['msg' => '转账信息发送成功,等待区块确认', 'status' => 200,'data'=>$result];
    }
    /**
     * 方法:生成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;
    }
    /**
     * 方法:获取余额
     * @param $address
     * @return int
     */
    function getBalance($address)
    {
        return $this->usdt->omni_getbalance($address,31)??0;
    }
    function getCoins()
    {
        return $this->usdt;
    }
}