Rückruf funktioniert nicht im Programm mit der Blockchain-API

Ich versuche, automatisierte Bitcoin-Zahlungen über die Blockchain-API zu erstellen. Ich habe meinen API-Schlüssel, xpub, alles. Ich verwende PHP.

Hier ist der Teil meines Codes zum Generieren der Wallet-Adresse:

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

Dieser Code funktioniert, aber ich habe ein Problem mit dem Rückruf an payment.php. Es wird nicht ausgelöst, wenn die Zahlung eingegangen ist, aber manuell kann ich die empfangene Zahlung simulieren, indem ich PHP mit den richtigen Parametern aufrufe.

Hier der relevante Teil von 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*';
?>

Mein Problem ist, dass der Rückruf nie aufgerufen wird – kann jemand meinen Code überprüfen und mir sagen, wo ich das Problem habe?

Danke

AKTUALISIEREN:

Ich habe ein wenig recherchiert und hier ist mein Ergebnis (aber es funktioniert immer noch nicht)

Ich habe die URL gefunden, um ein Callback-Protokoll direkt auf der Blockchain zu überprüfen: https://api.blockchain.info/v2/receive/callback_log?callback=http-urlencoded_my_website/callback.php?parameters&key=my-api-key

Das Log zeigt mir sowas an:

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

Kann mir da jemand helfen? Ich bin Inhaber dieser Domain und kann mit allen meinen Browsern auf diese Seite zugreifen.

Ich möchte nur darauf hinweisen, dass Ihr Code anfällig für SQL-Injection ist. Sind Sie wirklich sicher, dass der darin enthaltene Code if ($reci=='none') {tatsächlich ausgeführt wird?
$reci ist eine Variable, die von der tatsächlichen Empfangsadresse des Benutzers aus der MySQL-Datenbank zugewiesen wird ... und der Standardwert für dieses Feld ist "none". Ich habe es viele Male getestet und ja, es funktioniert ... diese if-Klausel vermeidet doppelte Generierung BTC-Adresse für Einzelbenutzer

Antworten (1)

LÖSUNG:

Es fing an zu funktionieren, nachdem ich die .htaccess-Datei aus /public_html auf meiner Webseite entfernt hatte.. so einfache Lösung..

Ich denke, es kann auch mit einer Neukonfiguration gemacht werden, aber ich verwende keine .htaccess, also war es die einfachste Lösung für mich :)