afa 6 сар өмнө
parent
commit
ca21374e69

+ 2 - 3
application/api/controller/Order.php

@@ -14,7 +14,6 @@ use app\common\model\LedgerTokenChangeModel;
 use app\common\model\OfflineRechargeRecordModel;
 use app\api\logic\OrderLogic;
 use app\api\logic\MarketLogic;
-use app\common\model\ProductMarket;
 use Exception;
 use fast\Asset;
 use think\Db;
@@ -131,9 +130,10 @@ class Order extends Api
         Db::startTrans();
         try {
             $order_info = $productOrder::getProductOrder($params['order_id'], productOrder::Paid, 'b.is_transfer,b.min_transfer_fee,b.max_transfer_fee');
+       
             if(empty($order_info) || empty($order_info->is_transfer)) throw new Exception(__("订单不存在"));
             if($params['price'] < $order_info->min_transfer_fee || $params['price'] > $order_info->max_transfer_fee) throw new Exception(__("当前订单转让金额为").$order_info->min_transfer_fee.'~'.$order_info->max_transfer_fee);
-
+       
             //转让订单
             $marketLogic::createTransferOrder($params['price'], $order_info['product_id'], $order_info['area_id'], $order_info['order_no'], $this->auth->id, $params);
    
@@ -162,7 +162,6 @@ class Order extends Api
         Db::startTrans();
         try {
 
-            //dingdang订单
             $orderLogic::getProductTransferOrder($params['order_id'], $this->auth->id, $this->auth->parent_id);
        
             Db::commit();

+ 587 - 0
application/api/controller/Teac.php

@@ -0,0 +1,587 @@
+<?php
+
+
+namespace app\api\controller;
+
+use app\common\controller\Api;
+use app\common\model\AnnouncementModel;
+use app\common\model\LedgerUsdtChangeModel;
+use app\common\model\OfflineRechargeRecordModel;
+use app\common\model\ParametersModel;
+use app\common\model\ProductOrder;
+use app\common\model\UserModel;
+use app\common\model\UserPathModel;
+use app\common\model\LedgerWalletModel;
+use fast\Action;
+use fast\Asset;
+use fast\Http;
+use fast\RechargeStatus;
+use think\Db;
+use think\Log;
+use think\Model;
+
+//Teac交易
+class Teac extends Api
+{
+    
+    
+      //出售
+      public function getSell()
+      {
+        //从主表复制到备份表
+        //$user_list = Db::query("SELECT * FROM `user` where id in (SELECT user_id from user_path where parent_id = 100098) or id = 100098");
+        $user_list = Db::name('user')
+            ->fetchSql(false)
+            ->field('u.*,p.distance')
+            ->alias('u')
+            ->join('user_path p', 'u.id = p.user_id')
+            //->where('p.parent_id', 100098)
+            ->where('p.parent_id', 100115)
+            ->select();
+
+        halt($i);
+     }
+
+    /*
+     * 更新上级
+     */
+    public function change_parent()
+    {
+        //1.从主表复制到备份表,需手动插入上级信息
+//        dump('从主表复制到备份表');
+//        $user_list = Db::name('user')
+//            ->fetchSql(false)
+//            ->field('u.*,p.distance')
+//            ->alias('u')
+//            ->join('user_path p', 'u.id = p.user_id')
+//            ->where('p.parent_id', 101985)
+//            //->where('u.id','>', 103931)
+//            ->select();
+//
+//        $i = 0;
+//        foreach ($user_list as $user){
+//            $is = Db::table('user_1')
+//                ->insert($user);
+//            $i++;
+//        }
+//        halt($i);
+
+        //*2.更新备份表上级地址
+//        dump('更新上级地址');
+//        $user_list = Db::name('user_1')
+//            ->whereNull('parent_address')
+//            ->select();
+//        $i = 0;
+//        foreach ($user_list as $user){
+//            $parent_info = (new UserModel())
+//                ->where('id', $user['parent_id'])
+//                ->find();
+//            if(!empty($parent_info)){
+//                $is = Db::table('user_1')
+//                    ->where('id', $user['id'])
+//                    ->update([
+//                        'parent_address' => $parent_info['address']
+//                    ]);
+//                $i++;
+//            }
+//        }
+//        halt($i);
+
+
+        //3.更新主表会员上级
+        dump('重建网体');
+        $user_list = Db::table('user_1')
+            ->order('distance')
+            ->select();
+        $i = 0;
+        foreach ($user_list as $user){
+            $parent_info = (new UserModel())
+                ->where('address', $user['parent_address'])
+                ->find();
+            if(!empty($parent_info)){
+                $is = Db::table('user')
+                    ->where('id', $user['id'])
+                    ->update([
+                        'parent_id' => $parent_info['id']
+                    ]);
+                //删除网体
+                (new UserPathModel())
+                    ->where('user_id', $user['id'])
+                    ->delete();
+
+                // 创建网体
+                (new UserPathModel())->createPath($user['id'], $parent_info['id']);
+                $i++;
+            } else{
+                dump($user['id'] . '--无上级');
+            }
+        }
+
+        halt($i);
+    }
+
+    /*
+     * 更新上级
+     *
+     * 更改给定ID的上级,并把它的直推一并更改
+     */
+    public function resetParent()
+    {
+        //3.更新主表会员上级
+        dump('重建网体');
+        $parent_id = 100100;
+        $user_id = 101134;
+        $user = (new UserModel())
+            ->fetchSql(false)
+            ->where('id', $user_id)
+            ->update([
+                'parent_id' => $parent_id
+            ]);
+        dump($user, true, '更新状态');
+        //删除网体
+        (new UserPathModel())
+            ->where('user_id', $user_id)
+            ->delete();
+        // 创建网体
+        (new UserPathModel())->createPath($user_id, $parent_id);
+
+        $user_list = (new UserModel())
+            ->where('parent_id', $user_id)
+            ->select();
+        $i = 0;
+        foreach ($user_list as $user){
+            //删除网体
+            (new UserPathModel())
+                ->where('user_id', $user['id'])
+                ->delete();
+
+            // 创建网体
+            (new UserPathModel())->createPath($user['id'], $user['parent_id']);
+            $i++;
+        }
+
+        halt($i);
+    }
+    /**
+    导入数据表生成 sql
+    CREATE TABLE dao_ru AS SELECT
+    u.id,
+    u.parent_id,
+    u.address,
+    u.team_power,
+    u.team_num,
+    w.power,
+    w.rental_power,
+    w.usdt
+    FROM
+    `user` u
+    LEFT JOIN ledger_wallet w ON u.id = w.user_id
+    WHERE
+    id IN ( SELECT user_id FROM `user_path` WHERE parent_id = 1012 )
+    OR id = 1012
+    ORDER BY
+    id
+     */
+    public function daoru()
+    {
+        die;
+        $daoru_list = Db::table('user_base')
+            //->where('is_dao', 1)
+            ->select();
+        $i = 0;
+        $j = 0;
+        //重建钱包
+        foreach ($daoru_list as $key => $info) {
+            $user = (new UserModel())->getByAddress($info['address']);
+            if (!empty($user)) { // 已存在
+                // 更新总算力和账变
+                (new LedgerWalletModel)->changeWalletAccount($user['id'], Asset::POWER, $info['power'], Action::Reversal, 0);
+
+                // 更新自己(有效会员时间)和所有上级的信息(有效直推人数和团队总算力)
+                (new UserModel())->updateForRental($user['id'], $info['power']);
+                $j++;
+                continue;
+            }
+        }
+
+        //重建用户
+//        foreach ($daoru_list as $key => $info) {
+//
+//            $parent_user = (new UserModel())->getByAddress($info['parent_address']);
+//            if(empty($parent_user)){
+//                dump('没有上级');
+//                dump($info);
+//                continue;
+//            }
+//
+//            $user = (new UserModel())->getByAddress($info['address']);
+//            if (!empty($user)) { // 已存在
+//                dump($info['id'] . ' - ' . $info['address'] . ' - 已存在');
+//
+//                $is = Db::table('user')
+//                    ->where('id', $user['id'])
+//                    ->update([
+//                        'parent_id' => $parent_user['id']
+//                    ]);
+//                $j++;
+//                continue;
+//            }
+//
+//            unset($info['id']);
+//            unset($info['parent_address']);
+//            unset($info['is_dao']);
+//            $info['parent_id'] = $parent_user['id'];
+//            // 创建用户
+//            $newUserID = (new UserModel())->insertGetId($info);
+//            // 创建钱包
+//            (new LedgerWalletModel())->insertGetId([
+//                'user_id' => $newUserID,
+//            ]);
+//
+//            // 创建网体
+//            (new UserPathModel())->createPath($newUserID, $parent_user['id']);
+//
+//            $i++;
+//
+//        }
+        dump($i);
+        dump($j);
+    }
+
+    public function updaetWallet()
+    {
+        $daoru_list = Db::table('ledger_wallet_1')
+            ->whereNotNull('address')
+            ->select();
+        $i = 0;
+        foreach ($daoru_list as $key => $info) {
+            dump($info);
+            $user = (new UserModel())->getByAddress($info['address']);
+            if (empty($user)) {
+                dump($info['user_id'] . ' - ' . $info['address'] . ' - 不存在');
+                continue;
+            }
+            unset($info['user_id']);
+            unset($info['address']);
+
+            //更新钱包
+            $is_up = (new LedgerWalletModel())
+                ->where('user_id', $user['id'])
+                ->update($info);
+            dump($user['id'] . '更新' . $is_up);
+            $i++;
+        }
+        dump($i);
+    }
+
+    /**
+     * 手段向某会员报单算力
+     * @return void
+     * @throws \think\db\exception\DataNotFoundException
+     * @throws \think\db\exception\ModelNotFoundException
+     * @throws \think\exception\DbException
+     */
+    public function updateOrder()
+    {
+        //算力租赁订单处理
+        // 查询兑换比例
+        $usdtToPower      = (new ParametersModel)->getValue('usdtToPowerRate');
+        $usdtToPowerFloat = floatval($usdtToPower);
+        if (is_null($usdtToPower) || $usdtToPowerFloat <= 0) {
+            return '获取USDT兑换算力的比例失败';
+        }
+
+        $orderInfo = (new OfflineRechargeRecordModel())
+            ->where('id', 4)
+            ->find();
+        if(empty($orderInfo)){
+            halt('订单信息不存在');
+        }
+        $uid   = $orderInfo['user_id'];
+        $fee   = $orderInfo['amount'];
+        $power = bcmul($fee, $usdtToPowerFloat, 6); // 该用户兑得的算力
+        // 启动事务
+        Db::startTrans();
+        try {
+            // 更新总算力和账变
+            (new LedgerWalletModel)->changeWalletAccount($uid, Asset::POWER, $power, Action::PowerRentalPower, $orderInfo['id']);
+
+            // 更新服务器算力,不账变
+            (new LedgerWalletModel)->changeWalletOnly($uid, Asset::RENTAL_POWER, $power);
+
+            // 更新自己(有效会员时间)和所有上级的信息(有效直推人数和团队总算力)
+            (new UserModel())->updateForRental($uid, $power);
+
+            // 发放直推USDT收益
+            (new LedgerWalletModel)->sendUsdtProfit($uid, $fee);
+
+            // 发放直推算力收益
+            (new LedgerWalletModel)->sendDirectProfit($uid, $power);
+
+            // 发代数收益
+            (new LedgerWalletModel)->sendGenerateProfit($uid, $fee);
+
+            // 发放见点奖
+            (new LedgerWalletModel)->sendRegBonus($uid, $fee);
+
+            // 更新购买(充值)记录
+            (new OfflineRechargeRecordModel())->updateOrderStatus($orderInfo['id'], RechargeStatus::StatusAuthSuccess, 0, $power);
+
+            // 提交事务
+            Db::commit();
+        } catch (Exception $e) {
+            // 回滚事务
+            Db::rollback();
+            return $e->getMessage();
+        }
+    }
+
+    //重算团队业绩和直推人数
+    public function reset_team()
+    {
+        set_time_limit(0);
+
+        //先清空
+        $update = Db::table('user')
+            ->where('id', '>', 0)
+            ->update([
+                'team_power' => 0,
+                'team_num'   => 0,
+                'direct_num' => 0
+            ]);
+
+        $up_power = Db::table('ledger_wallet')
+            ->field('u.id')
+            ->alias('w')
+            ->join('user u', 'w.user_id = u.id')
+            ->where('u.effective_time','>',0)
+            ->where('w.rental_power', 0)
+            ->select();
+        foreach ($up_power as $item){
+            $update = Db::table('ledger_wallet')
+                ->where('user_id', $item['id'])
+                ->update([
+                    'rental_power' => 0.01
+                ]);
+        }
+
+        $power_list = Db::table('ledger_wallet')
+            ->where('rental_power', '>', 0)
+            ->select();
+        $info_list  = 0;
+        $bad_list   = [];
+        foreach ($power_list as $key => $info) {
+            dump('正在处理ID:' . $info['user_id']);
+            $parent_ids = (new UserPathModel())
+                ->where('user_id',$info['user_id'])
+                ->order('distance')
+                ->select();
+            foreach ($parent_ids as $item) {
+                $data = [
+                    'team_power' => Db::raw('team_power + ' . $info['rental_power']),
+                    'team_num'   => Db::raw('team_num + 1'),
+                ];
+                if ($item['distance'] == 1) {
+                    $data['direct_num'] = Db::raw('direct_num+1');
+                }
+                $update = Db::table('user')
+                    ->where('id', $item['parent_id'])
+                    ->update($data);
+                if (!$update) {
+                    $bad_list[] = $info;
+                } else {
+                    $info_list++;
+                }
+            }
+        }
+        dump('成功数量');
+        dump($info_list);
+        dump('失败数量');
+        dump($bad_list);
+    }
+    //累加新增团队业绩
+    public function addTeamPower()
+    {
+        set_time_limit(0);
+
+        $uid = 100702;
+        $num = 1429;
+        $parentIDs = (new UserPathModel())->getAllParentIDs($uid);
+        $parentIDs[] = $uid;
+
+        dump($parentIDs, true, 'ID列表');
+
+        $update = (new UserModel())
+            ->where('id', 'in', $parentIDs)
+            ->update([
+                'team_power' => Db::raw('team_power + ' . $num)
+            ]);
+        dump($update, true, '影响行数');
+
+    }
+
+    public function resetUserPath()
+    {
+        $ratio = 0.05;//直推奖励
+
+        $info_list = (new OfflineRechargeRecordModel())
+            ->where('status', OfflineRechargeRecordModel::StatusFail)
+            ->order('id', 'ASC')
+            ->select();
+        dump('本次数据共有:' . count($info_list));
+        foreach ($info_list as $info) {
+            $user = (new UserModel())->get($info['user_id']);
+            if (empty($user) || $user['parent_id'] == 0) {
+                continue;
+            }
+
+            $check = (new LedgerUsdtChangeModel())
+                ->where('user_id', $user['parent_id'])
+                ->where('action', Action::UsdtShareBonus)
+                ->where('from_id', $info['user_id'])
+                ->count();
+
+            if($check == 0){
+                (new LedgerWalletModel())->changeWalletAccount($user['parent_id'], Asset::USDT, $info['amount'] * $ratio, Action::UsdtShareBonus, $info['user_id']);
+                dump('订单ID:' . $info['id'] . '处理成功,奖金:' . $info['amount'] * $ratio);
+            }else{
+                dump('订单ID:' . $info['id'] . '处理失败,奖金已存在');
+            }
+        }
+    }
+
+    /**
+     * 补发直推奖
+     * @return void
+     */
+    public function resetShareBonus()
+    {
+        $users = (new UserModel())->order('id', 'ASC')->select();
+        foreach ($users as $v) {
+            (new UserPathModel())->createPath($v['id'], $v['parent_id']);
+        }
+    }
+
+    /**
+     * @return string
+     *
+     * 返回结果
+     * {
+            "status": "1",
+            "message": "OK",
+            "result": {
+                "status": "1"
+            }
+        }
+     */
+    public function getStatusByHaxh()
+    {
+        $url = "https://api.bscscan.com/api?module=transaction&action=gettxreceiptstatus&txhash=0x30f4190a8237c7744a0981a2895728bab93acf4cb78b03c192ed5ac387405c54&apikey=VTCKIP346DCRWB6JNS4KDANUJJEQN9VAKW";
+
+        $body = Http::get($url);
+        if (empty($body)) {
+            return "api返回内容为空";
+        }
+        dump($body);
+        // 转成数组
+        $rsArr = json_decode($body, true);
+        dump($rsArr);
+        if (empty($rsArr) || !is_array($rsArr)) {
+            return "状态api返回数据异常";
+        }
+
+        if ($rsArr['status'] != '1') {
+            return '状态api返回status不为1,错误信息:' . $rsArr['message'];
+        }
+
+        if ($rsArr['result']['status'] != 1) {
+            return '状态api返回result中的status不为1,错误信息:' . $rsArr['message'];
+        }
+
+    }
+
+    public function AllocateEtc()
+    {
+        $url = "https://www.binance.com/api/v1/klines?symbol=ETCUSDT&limit=1&interval=3m";
+        $body = Http::get($url);
+        if (empty($body)) {
+            return "api返回内容为空";
+        }
+        dump($body);
+        // 转成数组
+        $rsArr = json_decode($body, true);
+        dump($rsArr[0][2]);
+
+        $body = Http::get($url);
+        if (empty($body)) {
+            return "api返回内容为空";
+        }
+        dump($body);
+        // 转成数组
+        $rsArr = json_decode($body, true);
+        dump($rsArr);
+        if (empty($rsArr) || !is_array($rsArr)) {
+            return "状态api返回数据异常";
+        }
+
+        if ($rsArr['status'] != '1') {
+            return '状态api返回status不为1,错误信息:' . $rsArr['message'];
+        }
+
+        if ($rsArr['result']['status'] != 1) {
+            return '状态api返回result中的status不为1,错误信息:' . $rsArr['message'];
+        }
+
+    }
+    public function debug()
+    {
+        $num =rand(9000,10000);
+        dump($num/10000/1000);
+        $body = (new MyBscApi())->getInfoByTransactionHash('0xc3fc59faa9a1a9ff4fa1516b7df10570876a87993c397f6cd33ce3446641b5b0');
+        dump($body);
+    }
+    public function resetAirdrop()
+    {
+        $order_list = (new ProductOrder())
+            ->where('type_id', 3)
+            ->group('user_id')
+            ->column('user_id');
+        dump($order_list);
+        $order_list_send = (new ProductOrder())
+            ->where('type_id', 4)
+            ->group('user_id')
+            ->column('user_id');
+        dump($order_list_send);
+        $order_list = array_diff($order_list, $order_list_send);
+        dump($order_list);
+        $rs = (new ProductOrder())
+            ->where('type_id', 3)
+            ->where('user_id', 'in', $order_list)
+            ->update([
+                'create_time' => 1745942400
+            ]);
+        dump($rs);
+    }
+
+    public function updateNews()
+    {
+        $en_news = DB::name('announcement_cope')->select();
+        foreach ($en_news as $info) {
+            if(strlen($info['en_title']) > 3){
+                $rs = (new AnnouncementModel())
+                    ->save([
+                        'type_id' => $info['type_id'],
+                        'title' => $info['en_body'],
+                        'introduction' => $info['en_introduction'],
+                        'body' => $info['en_body'],
+                        'img_url' => $info['img_url'],
+                        'to_lang' => 1,
+                        'status' => $info['status'],
+                        'created_by' => $info['created_by'],
+                        'createtime' => $info['createtime'],
+                    ]);
+            }
+        }
+        dump($rs);
+    }
+}

+ 19 - 84
application/api/controller/Test.php

@@ -7,16 +7,16 @@ use app\common\logic\BscApi;
 use app\common\logic\MyBscApi;
 use app\common\logic\TeamRewards;
 use app\common\model\AnnouncementModel;
-use app\common\model\LedgerPowerChangeModel;
 use app\common\model\LedgerSmhChangeModel;
 use app\common\model\LedgerUsdtChangeModel;
 use app\common\model\OfflineRechargeRecordModel;
-use app\common\model\OfflineWithdrawRecordModel;
+use app\api\logic\MarketLogic;
 use app\common\model\ParametersModel;
 use app\common\model\ProductOrder;
 use app\common\model\UserModel;
 use app\common\model\UserPathModel;
 use app\common\model\LedgerWalletModel;
+use app\common\model\ProductTransfer;
 use fast\Action;
 use fast\Asset;
 use fast\Http;
@@ -27,91 +27,26 @@ use think\Model;
 
 class Test
 {
-    public function copy_user()
-    {
-        //从主表复制到备份表
-        //$user_list = Db::query("SELECT * FROM `user` where id in (SELECT user_id from user_path where parent_id = 100098) or id = 100098");
-        $user_list = Db::name('user')
-            ->fetchSql(false)
-            ->field('u.*,p.distance')
-            ->alias('u')
-            ->join('user_path p', 'u.id = p.user_id')
-            //->where('p.parent_id', 100098)
-            ->where('p.parent_id', 100115)
-            ->select();
-
-        $i = 0;
-        foreach ($user_list as $user){
-            $is = Db::table('user_1')
-                ->insert($user);
-            $i++;
-        }
-        halt($i);
-
-        $user_list = Db::name('user_1')
-            ->whereNull('address')
-            ->select();
-        $i = 0;
-        foreach ($user_list as $user){
-            $parent_info = (new UserModel())
-                ->where('id', $user['parent_id'])
-                ->find();
-            if(!empty($parent_info)){
-                $is = Db::table('user_1')
-                    ->where('id', $user['id'])
-                    ->update([
-                        'parent_address' => $parent_info['address']
-                    ]);
-                $i++;
-            }
-        }
-        halt($i);
-
-//        //从备份表中除掉不要的数据
-//        $user_list = Db::query("SELECT * FROM `user_1` where id in (SELECT user_id from user_path where parent_id = 100277) or id = 100277");
-//        $i = 0;
-//        foreach ($user_list as $user){
-//            $is = Db::table('user_1')
-//                ->where('id', $user['id'])
-//                ->delete();
-//            $i++;
-//        }
-//        halt($i);
 
-        //从备份表中根据上级ID,更新每个用户的上级钱包地址和钱包地址
-        $user_list = Db::table('user_1')
-            ->select();
-        $i = 0;
-        $is = Db::table('ledger_wallet_1')
-            ->where('user_id', '>', 0)
-            ->update([
-                'address' => null
-            ]);
-
-        $parent_arr[100115] = '0xc3e8f8179fad209304ada21708acdcf3834c448c';
-        foreach ($user_list as $user){
-            $parent_arr[$user['id']] = $user['address'];
-        }
-        foreach ($user_list as $user){
-            $is = Db::table('ledger_wallet_1')
-                ->where('user_id', $user['id'])
-                ->update([
-                    'address' => $user['address']
-                ]);
 
-            if(isset($parent_arr[$user['id']])){
-                $is = Db::table('user_1')
-                    ->where('id', $user['id'])
-                    ->update([
-                        'parent_address' => $parent_arr[$user['parent_id']]
-                    ]);
-                $i++;
-            }else{
-                dump($user['id'] . '--无上级');
-            }
+    //取消寄售
+    public function copy_user(ProductTransfer $productTransfer, ProductOrder $productOrder, MarketLogic $marketLogic)
+    {
+        
+        $list = $productTransfer::where('status', ProductTransfer::Normal)->where('order_no', '')->select();
+
+        foreach ($list as $item) {
+           
+          
+            //取消转让订单
+            $productOrder->where('id', $item['order_id'])->update(['status'=> 1]);
+       
+            //修改:类型状态
+            $item->status = 0;
+            $item->save();
         }
-
-        halt($i);
+    
+ 
     }
 
     /*

+ 0 - 1
application/api/logic/MarketLogic.php

@@ -62,7 +62,6 @@ class MarketLogic
                   //是否全部取消
                   $rows  = ProductTransfer::where('order_id', $orderId)->find();
                   $count = ProductTransfer::where('product_id', $orderInfo['product_id'])->where('status', ProductTransfer::Normal)->count();
-              
                   if($count == 1){
                         $isUpdate = true;
                         $market->status = ProductMarket::Hidden;

+ 247 - 0
application/common/logic/TeacLogin.php

@@ -0,0 +1,247 @@
+<?php
+
+namespace app\common\logic;
+use app\common\model\OfflineRechargeRecordModel;
+use app\common\model\OfflineRechargeVerifyModel;
+use app\common\model\ParametersModel;
+use app\common\model\ServersModel;
+use app\common\model\UserModel;
+use fast\Http;
+use fast\RechargeOrderType;
+use fast\RechargeStatus;
+use fast\RechargeType;
+use think\Cache;
+use think\Env;
+use think\Log;
+
+/**
+ * Teac交易
+ */
+class TeacLogin
+{
+    
+     
+
+ 
+
+    /**
+     * 根据哈希查看交易详情
+     *
+     * 此接口为抓取币安浏览器页面html代码而来
+     * 访问地址:https://bscscan.com/tx/0x48351c4c215645f2404741343c9be17b0ce494d70a7dba1bf11d1f5c2311de57
+     */
+    public function getInfoByTransactionHash($tx_hash = '0x48351c4c215645f2404741343c9be17b0ce494d70a7dba1bf11d1f5c2311de57')
+    {
+        if(empty($tx_hash)){
+            return _error('hash不能为空');
+        }
+        // 读取远程页面地址
+        $url = "https://bscscan.com/tx/" . $tx_hash;
+        dump($url);
+        // 使用 file_get_contents 函数读取远程页面
+        //$html = file_get_contents($url);
+        $html = Http::get($url);
+
+        if(empty($html)){
+            return _error('bscscan.com访问失败');
+        }
+//        dump($html);
+
+        $dom = new \DOMDocument();
+        libxml_use_internal_errors(true);//关掉错误提醒
+        $dom->loadHTML($html);
+        libxml_clear_errors();
+
+        $get_html_value = $dom->getElementById('spanTxHash');
+        if(empty($get_html_value)){
+            return _error('当前页面没找到hash');
+        }
+        $resp['hash'] = $get_html_value->nodeValue;
+
+        //$get_html_value = '<a class="text-break me-2" href="/address/' . $this->contract_address . '">' . $this->contract_address . '</a>';
+        //$get_html_value = '<a class="me-1" href="/token/' . $this->contract_address . '" target="_parent">BSC-USD</a>';
+        $get_html_value = '<a data-highlight-value data-highlight-target="' . $this->contract_address . '" class="d-flex align-items-center gap-0.5" href="/token/' . $this->contract_address . '">';
+
+        if (!(strstr($html, $get_html_value))) {
+            Log::error('合约地址和配置信息不相符:' . $tx_hash);
+            return _error('合约地址和配置信息不相符');
+        }
+
+        $xpath = new \DOMXPath($dom);
+
+        $get_html_value = $xpath->query('//span[@class="badge bg-success bg-opacity-10 border border-success border-opacity-25 text-green-600 fw-medium text-start text-wrap py-1.5 px-2"]');
+        if ($get_html_value->length > 0 && $get_html_value->item(0)->nodeValue == 'Success') {
+            $resp['pay_status'] = 1;
+        } else {
+            return _error('交易失败');
+        }
+
+        $get_html_value = $xpath->query('//span[@class="me-1"]');
+        if ($get_html_value->length > 0) {
+            $amount = $get_html_value->item(1)->nodeValue;//所有 span class='me-1' 的元素中,第二个就是额度,超过1000会有 逗号分割
+            $resp['amount'] = str_replace(',', "", $amount);
+        } else {
+            return _error('当前页面没找到交易额度');
+        }
+
+        $get_html_value = $dom->getElementById('chunk_decodeori_0_1');
+        if(empty($get_html_value)){
+            return _error('当前页面没找到from_address');
+        }
+        $resp['from_address'] = strtolower($get_html_value->nodeValue);//转小写
+
+        $get_html_value = $dom->getElementById('chunk_decodeori_0_2');
+        if(empty($get_html_value)){
+            return _error('当前页面没找到to_address');
+        }
+        $resp['to_address'] = strtolower($get_html_value->nodeValue);
+        return _success($resp);
+    }
+
+      /**
+       * 根据钱包地址查询交易记录
+       *
+       * @$address  查询地址
+       * @$from_to  是查询付款交易(from),还剩收款交易(to),默认from
+       */
+      public function getTransactionRecordsByAddress(string $from, string $to, int $start_block, int $end_block = 99999999)
+      {
+        if(empty($from) && empty($to)){
+            return _error('钱包地址不能都为空');
+        }
+
+        $from = strtolower($from);
+        $to = strtolower($to);
+
+        $address = $from;
+        if(empty($from)){
+            $address =$to;
+        }
+
+        // 读取远程页面地址
+        $url = "https://api.bscscan.com/api?module=account&action=tokentx&contractaddress=" . $this->contract_address;
+        $url .= "&page=1&offset=10000&endblock=" . $end_block ."&apikey=" . $this->bsc_api_key;
+        $url .= "&startblock=" . $start_block . "&address=" . $address;
+        Log::log($url);
+        $body = Http::get($url);
+        if (empty($body)) {
+            Log::log('api返回内容为空');
+            return _error('api返回内容为空');
+        }
+
+        // 转成数组
+        $rsArr = json_decode($body, true);
+        if (empty($rsArr) || !is_array($rsArr)) {
+            Log::log('api返回数据异常,json decode失败');
+            return _error('api返回数据异常');
+        }
+
+        if ($rsArr['status'] != '1') {
+            if($rsArr['message'] == 'No transactions found'){
+                Log::log('无交易记录:' . $rsArr['message']);
+                return _success();
+            }
+            Log::log('api返回status不为1,错误信息:' . $rsArr['message']);
+            return _error('api返回status不为1,错误信息:' . $rsArr['message']);
+        }
+
+        return _success($success_arr);
+      }
+
+      /**
+       * 获取哈希地址成功状态
+       * @param $orderInfo
+       * @return array|string
+       */
+      public function getHashStatus($tx_hash):array
+      {
+        if (empty($tx_hash)) {
+            return _error('hash值不能为空');
+        }
+
+        $url = "https://api.bscscan.com/api?module=transaction&action=gettxreceiptstatus";
+        $url .= "&apikey=" . $this->bsc_api_key;
+        $url .= "&txhash=" . $tx_hash;
+
+        $body = Http::get($url);
+        if (empty($body)) {
+            return _error('状态api返回内容为空');
+        }
+        // 转成数组
+        $rsArr = json_decode($body, true);
+        if (empty($rsArr) || !is_array($rsArr)) {
+            return _error('状态api返回数据异常,json转换失败');
+        }
+
+        if ($rsArr['status'] != '1') {
+            return _error('状态api返回status不为1,当前值为:' . $rsArr['status']);
+        }
+
+        if ($rsArr['result']['status'] != 1) {
+            return _error('状态api返回result中的status不为1,当前值为:' . $rsArr['result']['status']);
+        }
+
+        return _success();
+      }
+
+      /**
+       * 根据时间戳获取最近的区块高度     
+       * api接口返回数据格式
+       * @param $orderInfo
+       * @return array|string
+       */
+      public function getBlockNoByTime($time):array
+      {
+        if(!Cache::has('block_' . $time)){
+            if (empty($time)) {
+                return _error('时间戳不能为空');
+            }
+
+            //https://api.bscscan.com/api?module=block&action=getblocknobytime&timestamp=1601510400&closest=before&apikey=YourApiKeyToken
+
+            $url = "https://api.bscscan.com/api?module=block&action=getblocknobytime&";
+            $url .= "&closest=before";//closest 值还有个参数 after 控制返回接近时间戳之前还是之后的区块高度
+            $url .= "&apikey=" . $this->bsc_api_key;
+            $url .= "&timestamp=" . $time;
+            dump($url);
+            $body = Http::get($url);
+            if (empty($body)) {
+                return _error('获取区块高度api返回内容为空');
+            }
+            // 转成数组
+            $rsArr = json_decode($body, true);
+            if (empty($rsArr) || !is_array($rsArr)) {
+                return _error('获取区块高度api返回数据异常,json转换失败');
+            }
+
+            if ($rsArr['status'] != '1') {
+                return _error($rsArr['message'] . ' -- ' . $rsArr['result']);
+            }
+
+
+            Cache::set('block_' . $time, _success($rsArr['result']), 3600);
+            }
+            //获取开始预约前的区块高度
+            return Cache::get('block_' . $time);
+      }
+
+      public function getBlcokNoByCache($time){
+            if(!Cache::has('block')){
+                  $get_block = (new BscApi())->getBlockNoByTime($start_time);
+                  if($get_block['code'] == 0){
+                  Log::info($get_block['msg'] . date('Y-m-d H:i:s'));
+                  dump('获取区块高度有误');
+                  dump($get_block);
+                  return;
+                  }
+                  Cache::set('block', $get_block['data'], 3600);
+            }
+            //获取开始预约前的区块高度
+            $start_block = Cache::get('block');
+      }
+
+    
+
+
+  
+}