Обратный вызов не работает в программе, использующей блокчейн API

Я пытаюсь создать автоматизированный прием биткойн-платежей через Blockchain API. У меня есть ключ API, xpub и все такое. Я использую PHP.

Вот часть моего кода для генерации адреса кошелька:

$scrt = my_super_secret_code_60_chars_long;
$my_callback_url = "http://mysite.com/lib/payment.php?secret={$scrt}";
$my_xpub = "my_xpub_key";
$my_api_key = "my_secret_api_key";

$root_url = "https://api.blockchain.info/v2/receive";
$parameters = "xpub=" .$my_xpub. "&callback=" .urlencode($my_callback_url). "&key=" .$my_api_key;


$qry= "SELECT ID,RECEIVE_ADDR FROM MY_TABLE WHERE WALLET = '{$_GET['wallet']}' ";
$result = mysqli_query($conn,$qry);
$row = mysqli_fetch_row($result);
$reci = $row[1];
$uid = $row[0];
if ($reci=='none') {
//if the user does not have generated receive address, triggering this
$response = file_get_contents($root_url . '?' . $parameters);
$object = json_decode($response);

echo 'Send Payment To : ' . $object->address;

$qry= "UPDATE MY_TABLE SET RECEIVE_ADDR='". $object->address ."' WHERE WALLET = '{$_GET['wallet']}' ";
mysqli_query($conn,$qry);   
 } 

Этот код работает, но у меня проблема с обратным вызовом в payment.php. Он не срабатывает при получении платежа, однако вручную я могу смоделировать полученный платеж, вызвав PHP с правильными параметрами.

Вот соответствующая часть payment.php:

<?php
$scrtt = $_GET['secret']; //password is passed back to the callback URL
$transaction_hash = $_GET['transaction_hash'];
$value_in_satoshi = $_GET['value'];
$value_in_btc = $value_in_satoshi / 100000000;

$gt='CALLBACK CALLED - TXID:'.$transaction_hash.' VALUE '.$value_in_satoshi.' SCRT:'.$scrtt.' CONFIRMS:'.$_GET['confirmations'];
$qry= "INSERT INTO DEBUG (TE) VALUES ('{$gt}')";
mysqli_query($conn,$qry);
//code above is for debugging - but not triggered however payment is received
if ($scrtt== my_super_secret_code) {
if ($_GET['confirmations'] >= 2) {
$confirms=$_GET['confirmations'];   
$qry= "SELECT ID FROM MY_TABLE WHERE RECEIVE_ADDR = '{$_GET['address']}'";

$result = mysqli_query($conn,$qry);
$row = mysqli_fetch_row($result);
$uid = $row[0];

$qry= "SELECT TXHASH FROM PAYMENTS WHERE TXHASH = '{$_GET['transaction_hash']}' ";

$result = mysqli_query($conn,$qry);
$row = mysqli_fetch_row($result);
$tx = $row[0];

if ($tx <> $transaction_hash) {

    $qry="INSERT INTO PAYMENTS (TXHASH,USER_ID,SATS,CONFIRMS) VALUES ('{$transaction_hash}',{$uid},{$value_in_satoshi},{$confirms})";
mysqli_query($conn,$qry);       

//new tx - insert   
}

//Insert into confirmed payments

} 
}
echo '*ok*';
?>

Моя проблема в том, что обратный вызов никогда не вызывается — может ли кто-нибудь проверить мой код и сказать мне, в чем проблема?

Благодарность

ОБНОВИТЬ:

Я немного исследовал, и вот мой результат (однако он все еще не работает)

Я нашел URL-адрес для проверки журнала обратного вызова непосредственно в блокчейне: https://api.blockchain.info/v2/receive/callback_log?callback=http-urlencoded_my_website/callback.php?parameters&key=my-api-key

Журнал показывает мне что-то вроде этого:

callback":"http://mysite.com/callback.php?param=myparam","called_at":"2017-03-10T13:05:39Z","response_code":403,"raw_response":"<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML 2.0//EN\">\n<html><head>\n<title>403 Forbidden</title>\n</head><body>\n<h1>Forbidden</h1>\n<p>You don't have permission to access /callback.php\non this server.<br />\n</p>\n<p>Additionally, a 403 Forbidden\nerror was encountered while trying to use an ErrorDocument to handle the request.</p>\n</body></html>\n"}]

Может ли кто-нибудь помочь мне с этим? Я владелец этого домена и могу получить доступ к этой странице во всех своих браузерах.

Я просто хотел бы указать, что ваш код уязвим для SQL-инъекций. Вы точно уверены, что код внутри if ($reci=='none') {действительно выполняется?
$reci - это переменная, которая назначается из фактического адреса получения пользователя из базы данных mysql.. и значением по умолчанию для этого поля является «none».. Я тестировал его много раз, и да, он работает.. это условие if позволяет избежать двойного создания Адрес BTC для одного пользователя

Ответы (1)

РЕШЕНИЕ:

Он начал работать после удаления файла .htaccess из /public_html на моей веб-странице... такое простое решение...

я думаю, что это можно сделать и с некоторой перенастройкой, но я не использую .htaccess, поэтому для меня это было самое простое решение :)