下边介绍基于 比特币网络的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"] => 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);
}
});
}
}