Почему не работает Blockchain?

176
03 апреля 2019, 21:20

Доброго времени суток!

Прошу вас помочь с проблемой. Суть: У меня на сайте есть модуль для приема оплаты в BTC... Кошелёк он генерирует, но транзакцию не добавляет, но деньги приходят на мой кошелек(это работает)

Почему он не добавляет транзакцию? Да и как в целом можно улучшить код?

UserController.php(см. функцию payment)

<?php
namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
use DB;
use Request;
use Cookie;
class UserController extends Controller
{
    public function main(){
        if(!Cookie::get('auth')){
            return redirect('/login');           
        }else{
            $id = strval(strip_tags((Cookie::get('auth'))));
            $users = DB::select('select * from `users` where id = ?',[$id]);
            if(count($users) > 0){
            $user = json_decode(json_encode($users[0]), true);
            if(count($user) > 0 and intval($user['activation']) == 0){
                $admins = DB::select('select * from `admin`');
                $admin = json_decode(json_encode($admins[0]), true);
                $sale = $this->fromTo(floatval($admin['sale']));
                if(!Cookie::get('address')){
                // Get contents
                $my_callback_url = urlencode('http://'.$_SERVER['HTTP_HOST'].'/payment_check/panin228?id='.$id);
                $root_url = "https://api.blockchain.info/v2/receive?xpub=xpub6D8hg1pk6Jsw2VahsQufyJU9fyuDwrjE36oewoga8pyMT12q91Qrz1cUoH2UkzwzwjHREqB9778QsZDiUs37LFVw86BTrMuDArS5D2T4Lok&callback=$my_callback_url&key=41676b0e-8fb5-4796-a914-63f6b4d11be6";
                $response = $this->getData($root_url) or die(print_r(error_get_last()));
                $wallet = json_decode($response, true);
                $message = (array_key_exists('message', $wallet)) ? true : false;
                if($message == false){
                    $address = strval($wallet['address']);
                    Cookie::queue('address', $address, 7);
                    return view('pages/active', ['address' => $address, 'sale' => $sale]);
                }else{
                    return $wallet['message'];
                }
                }else{
                    $address = Cookie::get('address');
                    return view('pages/active', ['address' => $address, 'sale' => $sale]);
                }
            }else{
                if(count($user) > 0){
                    return view('profile_main', ['title' => 'Private office', 'user' => $user]);
                }
            }
        }
        }
    }
    public function active_post(){
        if(!Cookie::get('auth')){
            return redirect('/login');
        }else{
            $id = strval(strip_tags((Cookie::get('auth'))));
            // Id
            $admins = DB::select('select * from `admin`');
            $admin = json_decode(json_encode($admins[0]), true);
            $sale = $this->fromTo(floatval($admin['sale']));
            // /Sale
            $trans = DB::select('select * from `payments` where secret = ?', [$id]);
            if(count($trans) > 0){
            $tran = json_decode($trans[0], true);
            $add = $tran['value'];
            $activate = DB::update('update `users` set balance = ? where id = ?', [$add, $id]);
            if(count($tran) > 0 && $activate){
            // Update balance
            $users = DB::select('select * from `users` where id = ?', [$id]);
            $user = json_decode(json_encode($users[0]), true);
            if(intval($user['activation']) == 1){
                return redirect('/profile');
            }else{
                $balance = floatval($user['balance']);
                if($balance >= $sale){
                    $activate = DB::update('update `users` set activation = 1 where id = ?', [$id]);
                    if($activate){
                        return redirect('/profile');
                    }
                }else{
                    exit('Платеж меньше нужно суммы...');
                }
            }
            }else{
                exit('Не удалось найти платеж...');
            }
            }else{
                exit('Не удалось найти транзакции...');
            }
        }
    }
    public function payment($secret){
        if($secret == 'panin228'){
            $get = Request::all();
            $transaction_hash = $get['transaction_hash'];
            $value_in_satoshi = floatval($get['value']);
            $value_in_btc = $value_in_satoshi / 100000000;
            $sql = 'insert into `payments` (secret, transaction_hash, value) values(?, ?, ?)';
            $secret2 = intval($get['id']);
            $ins = DB::insert($sql, [$secret2, $transaction_hash, $value_in_btc]);
            if($ins){
                echo "*ok*";
            }
        }
    }
    public function logout(){
        if(!Cookie::get('auth')){
            Cookie::queue('auth', 0, 0);
            return redirect('/login');
        }else{
            return redirect('/login');
        }
    }
    public function getData($url){
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        $data = curl_exec($ch);
        curl_close($ch);
        return $data;
    }
    public function fromTo($value_in_usd){
        $btc = file_get_contents("https://blockchain.info/tobtc?currency=USD&value=$value_in_usd");
        $btc = floatval($btc);
        return $btc;
    }
}
Answer 1

Разобраться, почему он не добавляет транзакцию - это второй вопрос. Сначала советую взглянуть на код, а именно на ошибки, которые видны невооруженным глазом:

Не стоит писать код для защиты от неавторизованного доступа в контроллере. Это плохая практика, для этого есть Middleware.

if(!Cookie::get('auth')){
   return redirect('/login');           
}

Со стороны безопасности, данный код просто ужасен:

$id = strval(strip_tags((Cookie::get('auth'))));

Он нам говорит, что в $_COOKIE['auth'] лежит не токен пользователя для авторизации и не ID сессии, а напрямую ID пользователя. То есть, теоретически, подставив туда ID пользователя, мы получаем доступ к любому аккаунту.

Вместо SQL запросов Laravel нам предоставляет Eloquent модели. Если бы их не было, то за получение данных должен отвечать либо репозиторий, либо модель, либо, в крайнем случае, сервис. Получать данные из SQL напрямую в контроллере - зло:

//очень плохо
$users = DB::select('select * from `users` where id = ?',[$id]);
//лучше
$users = User::find($id);
//отлично
$user = Auth::user();

Ссылку на API лучше оставить в константе какого-либо класса-словаря:

//вместо
$root_url = "https://api.blockchain.info/v2/receive?xpub=xpub6D8hg1pk6Jsw2VahsQufyJU9fyuDwrjE36oewoga8pyMT12q91Qrz1cUoH2UkzwzwjHREqB9778QsZDiUs37LFVw86BTrMuDArS5D2T4Lok&callback=$my_callback_url&key=41676b0e-8fb5-4796-a914-63f6b4d11be6";
                $response = $this->getData($root_url) or die(print_r(error_get_last()));
class ApiDictionary {
  const URL = "https://api.blockchain.info/v2/receive?xpub=xpub6D8hg1pk6Jsw2VahsQufyJU9fyuDwrjE36oewoga8pyMT12q91Qrz1cUoH2UkzwzwjHREqB9778QsZDiUs37LFVw86BTrMuDArS5D2T4Lok&callback=$my_callback_url&key=41676b0e-8fb5-4796-a914-63f6b4d11be6"
}
//в контроллере
$response = $this->getData(ApiDictionary::URL) or die(print_r(error_get_last()));

Никогда не стоит выполнять die() в рабочем коде. Вместо этого мы должны выкидывать определенное исключение (Exception), которое потом обрабатывать и выдавать соответствующую ошибку пользователю.

Что касается того, почему он не работает - то дайте хоть какую-либо ошибку, которую выбрасывает laravel.

READ ALSO
Drupal 8 в Firefox Код ошибки: SEC_ERROR_UNKNOWN_ISSUER

Drupal 8 в Firefox Код ошибки: SEC_ERROR_UNKNOWN_ISSUER

Знакомство с Drupal началось с проблемУстановлен Openserver 5

162
Как убрать язык с которого переходишь? request()-&gt;path();

Как убрать язык с которого переходишь? request()->path();

Как получить get curent url только конец ? http://siteru/ru/newpage

114
Передача поля, которого нет в модели yii2

Передача поля, которого нет в модели yii2

Задача: При добавлении записи, вносить данные в несколько таблицВ одну таблицу вводится информация из пользовательских данных, в другую...

153
Лучшие API для работы с погодой PHP [закрыт]

Лучшие API для работы с погодой PHP [закрыт]

Задача стоит в том, чтобы сделать чат-бота который по городу будет возвращать погоду на сегодняПодскажите, пожалуйста, достойные API для данной...

145