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.
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í :)
adam lindsay
if ($reci=='none') {
realmente se ejecuta?Fero