La devolución de llamada no funciona en el programa usando la API de blockchain

Estoy tratando de crear pagos automatizados de Bitcoin a través de la API Blockchain. Tengo mi clave API, xpub, todo. Estoy usando PHP.

Aquí está la parte de mi código para generar la dirección de la billetera:

$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);   
 } 

Este código funciona, pero tengo un problema con la devolución de llamada a payment.php. No se activa cuando se recibe el pago; sin embargo, manualmente, puedo simular el pago recibido llamando a PHP con los parámetros correctos.

Aquí está la parte relevante de 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*';
?>

Mi problema es que la devolución de llamada nunca se llama: ¿alguien puede verificar mi código y decirme dónde está el problema?

Gracias

ACTUALIZAR:

Investigué un poco y aquí está mi resultado (sin embargo, todavía no funciona)

Encontré la URL para verificar un registro de devolución de llamada directamente en la cadena de bloques: https://api.blockchain.info/v2/receive/callback_log?callback=http-urlencoded_my_website/callback.php?parameters&key=my-api-key

El registro me muestra algo así:

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"}]

¿Puede alguien ayudarme con eso? Soy propietario de este dominio y puedo acceder a esta página con todos mis navegadores.

Solo me gustaría señalar que su código es vulnerable a la inyección de SQL. ¿Está definitivamente seguro de que el código interno if ($reci=='none') {realmente se ejecuta?
$reci es una variable que se asigna desde la dirección de recepción real del usuario desde la base de datos mysql... y el valor predeterminado para ese campo es 'ninguno'... Lo probé muchas veces y sí, funciona... esta cláusula if evita la generación doble Dirección BTC para un solo usuario

Respuestas (1)

SOLUCIÓN:

Comenzó a funcionar, después de eliminar el archivo .htaccess de /public_html en mi página web... solución tan simple...

Creo que también se puede hacer con alguna reconfiguración, pero no estoy usando .htaccess, así que fue la solución más simple para mí :)