Доброго времени суток!
Прошу вас помочь с проблемой. Суть: У меня на сайте есть модуль для приема оплаты в 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;
}
}
Разобраться, почему он не добавляет транзакцию - это второй вопрос. Сначала советую взглянуть на код, а именно на ошибки, которые видны невооруженным глазом:
Не стоит писать код для защиты от неавторизованного доступа в контроллере. Это плохая практика, для этого есть 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.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Какие существуют виды рекламных бордов и как выбрать подходящий?
Знакомство с Drupal началось с проблемУстановлен Openserver 5
Как получить get curent url только конец ? http://siteru/ru/newpage
Задача: При добавлении записи, вносить данные в несколько таблицВ одну таблицу вводится информация из пользовательских данных, в другую...
Задача стоит в том, чтобы сделать чат-бота который по городу будет возвращать погоду на сегодняПодскажите, пожалуйста, достойные API для данной...